出産前後の痔にはご注意!

0があると、そこで表示をやめるものだと教わりましたが、

char c[]="123045";
printf("%s\n",c);

とやった所、123ではなく、123045が表示されました。
これはなぜなんでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (8件)

で、これだけ皆さんが質問してくれて、質問者さんからの反応は?



。。。。こういうのって最低限の礼儀だと思うのだけど、こういうこと書くと削除依頼とかになるんだよなあ。。。。。。。。
    • good
    • 0

たぶん下のコメントで答え出ちゃってると思うけど、私なりの表現で答えると、



0は0x30、NULLは0x00。
表示がとまる(文字列の終端と判断される)のはNULLの方。

質問者さんの言ってる 0 は 0x30 の方だから表示されてしまう。

もう少し書くと、"123045" の 5 の次にNULLがあるから(こういう記述をするとコンパイラが文字列の最後にNULLを用意してくれる)、123045で表示が止まるわけですよ。
    • good
    • 0

気持ちはすごく良く分かります。

いろいろと回答が出ていて、その通りなのですが、補足したいと思います。

一言で言えば、「文字(コード)」と「数値」は違う、ということになりますが、特に C では文字コードが数値的な扱いをされていたりして、ちゃんと理解していないと混乱の元になります。

例えば、

printf( "%c?n", '1' + 1 );

とすると "2" という文字が表示されます。しかし、

printf( "%c?n", '1' + '1' )

とすると不思議(!)なことに "b" と表示されます。なぜかというと、

printf( "1=%d b=%d?n", '1', 'b' );

とすると '1' の値(文字コードの値)は 49 で、'b' の値は 98 です。ということで 49+49=98 なので、"b" が表示されるのです。

C に限らず、全ての文字(日本語の文字を含め)はそれぞれが数値で識別できるようになっていて、それを「文字コード」と呼んでいます。

printf の %d は数値を「数字の並び」に変換して、それを文字として出力します。%c あるいは %s は数値をそのまま文字として出力します。scanf で %d は数字列を整数値に変換します。

またプログラム中で例えば 'b' と書くと、b という文字の文字コードに置き換わります。勿論 'b' の代わりに 98 と書いてもプログラム的には全く同じなのですが、こうしてしまうとプログラムが大変読みにくくなってしまいます。

ということで「文字」と「数値」の違いをちゃんと理解してください。
    • good
    • 0

人に聞く前に自分で確かめましょう。


int i;
char c[]="123045";
printf("%s\n",c);
for( i = 0; i < 7; i++ ) printf( "%02x ", c[ i ] );
ゼロはどこに出てきました?
    • good
    • 0

C言語において、文字列の終端を表わすのは


'0'ではなく'\0'です。

char c[]="123045";
というc[]の定義は、
char c[] = { '1', '2', '3', '0', '4', '5', '\0' };
と同義です。
これでおわかりになりますか?
    • good
    • 0

""←で囲っているため、中の内容は全て「文字」として


取り扱われます。

で、ASCIIコードを見ると、
0=0x00 NULL となります。
"0"=0x30 0 となります。
人間の見た目の「0」でも、コンピュータにとっては
全くの別物です。

NULLは文字列の終端=そこで終わり
"0"は文字の「0」=NULLではないので終わらない

説明下手ですが・・・

※URLはASCIIコードのURLです。

参考URL:http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html
    • good
    • 0

>0があると、そこで表示をやめるもの


ボクの勉強不足ならごめんなさいですが、上のような話しは聞いたことがありません。
それが可能だと、"0"を含めた数値文字列変数の確保ができなくなってしまいます。(端的にいうと、演算ができなくなります)
何か、重要なことが話から抜けていませんか?
char型ということは、hex型で文字を表現することができます。
"123045"はsjisのhexで0x313233303435となります。
で、hex型には0x00という文字があり、これはnullをあらわしています。
C言語の世界では、文字列charの中にnullが存在していると確かにそこで文字列表現は終了します。(ちなみに、文字列にあえてnullを残しておきたい場合はバイナリ(hex)で文字列を扱います)
どのように教わったのかもう一度整理してみてください。
    • good
    • 0

char c;


c = 0;
c = "0";
は異なります。
前者は、NULLコードで、そこで文字列の終端となります。
後者は、文字コードで表記すると、0x30です。
したがって、文字として扱われるため、そのまま表示されます。
    • good
    • 0

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


人気Q&Aランキング