• 締切済み

これで正しいのでしょうか?

文字列の先頭にNULLを付けたい時文字列の次の文字が半角の数字だった場合"\01234"とすると先頭がNULLになりませんでした。 "\0001234"としたときちゃんとNULLになり、その場合"\000こんにちわ"でも先頭はNULLでした。"\0こんにちわ"もNULLでした。\000というのは正しい使い方なのでしょうか? #include <stdio.h> int main() { char str[] = "\0009\n"; printf("%s", str+1); return 0; } ついでに質問です。"こんにちわ\n"や"おはよう\n"などの文字列の先頭にNULLを付けて初めから文字列リテラルを作りたい場合にマクロで"\000こんにちわ\n"などと置き換えたい場合、できればM("こんにちわ\n")という形で作る事は可能でしょうか? M(こんにちわ\n)を"\000こんにちわ\n"に置き換えるマクロは作れました。 #define M(str) M1(\000##str) #define M1(str) #str こんな感じなのですがもっとうまい方法はありますか? よろしくお願いします。

みんなの回答

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

NULLは「どこも指していないポインタ」の意味で使うのが正しいです。 文字列の終端などを表わす'\0'の意味では、使えません。

yozakura20
質問者

お礼

"\0"は正しくないんですね~。 勉強になります。

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

NULLのエスケープ文字は\0ですが \xxx等の3ケタの数字は8進数表記の文字コードとみなされます。 \000は8進数表記で文字コード0(NULL)を表記していると解釈されます。 "\01234" → '\012' , '3' , '4' "\0001234" → '\000' , '1' , '2' , '3' , '4' と解釈されます。 つか、NULLは文字列のターミネータに使うのが普通で文字列の先頭につけるものではありませんし、言語がそういう使い方を想定して設計されていません。 文字列の先頭にNULLを必要とするプログラムの考え方自体に無理があるような気がします。

yozakura20
質問者

お礼

回答ありがとうございます。 8進数になっているんですね。勉強になりました

関連するQ&A