アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語の以下のプログラムをコンパイルすると、0x6123は大きすぎる旨のコンパイルエラーとなります。
char str[]="abc\x6123";

char str[]="abc\14123";
は¥141の141を8進数とみなし、上手くいきます。

なぜ、最初のケースは\x61の61を16進数としてくれないのですか

16進数も3桁で記述する旨のサイトもあったので、

char str[]="abc\x06123";

としてみましたが、同じ結果になります。

使用しているのは、VisualStudio2017です。

A 回答 (6件)

必要な人は少数だと思うけど #1 のところにあった「確認」のはなし.



ワイド文字 (ワイド文字列) であっても
8進エスケープシーケンスでは最大 3桁しかとらない
という条件は変わらないため, 結局最大 9ビットしか与えられないことになります. つまり 10ビット以上が必要なときには 16進エスケープシーケンスで書かないといけません.
    • good
    • 0
この回答へのお礼

ありごとうございました。
多くの方に回答いただきましたが、一番知りたかった回答だったので、ベストアンサーとさせていただきます。

お礼日時:2019/09/06 13:08

ぶっちゃけていえば「そういうルール」だから.



8進数を使う場合には最長 3桁と決まっているんだけど, 16進数で書くときには長さ無制限です. ということで
char str[] = "abcde\x61";

char str[] = "abcde\x00000000000000000000000000000000000000000000000000000000000000000000000000061";
は同じ. まあこんなふうに書いてきたら突き返すけど.

で回避策は #4 の通り.
    • good
    • 0

C言語の文字列リテラルは、連続して書いたものが連結されて使われます。


char *s = "ABCDEF" ;

char *s = "AB" "CD" "EF" ;
は同等です。


それを使えば
char str[]="abc\x06" "123";
等と書けます
    • good
    • 1
この回答へのお礼

ありがとうございました。
ベストアンサーが2つ選べたら、こちらもベストアンサーにしたかったのですが、すみません。
でも、本当に助かりました。感謝します。

お礼日時:2019/09/06 13:11

「\xは続く2桁の16進数」と説明しているのもありますが,この場合4桁になってしまうのですね。

初めて知りました。
「abca23」(2番目のaは16進数で指定)の文字列を入れるには,
char moji[]="abc 23";
moji[3]=\x61;
のように,(とりあえず空白文字を入れておいて)後から書き替えるしかないでしょうかね。
    • good
    • 0

格納される場合を考えると


char str[]="abc\x6123";

str[0]=0x61
str[1]=0x62
str[2]=0x63
str[3]=0x6123 <-エラーとなります。
char 型なので格納サイズは1バイト〈0x0から-0xff〉です
0x6123を格納しようすればunsigned int16 にしないといけないです。
表示する文字を格納する場合
0x6123が文字コードである場合は、格納先をCstringとかにした方がぶなんです。
あるいは、6123を上下バイトに分けて格納します。
char str[]="abc\x61\x23";
    • good
    • 0

\x6123 は、0x6123 という2バイトコードと解釈されます。

(漢字とかに使われる幅です)
なので、charに収まらないということでコンパイルエラーとなります。
    • good
    • 1
この回答へのお礼

早速の回答ありがとうございました。
1つ確認したいのですが、
16進文字定数は2バイトコードも表現できるが、8進文字定数は1バイトコードしか表現できないという解釈でよいのでしょうか。

お礼日時:2019/08/30 14:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!