- 締切済み
c[]="123045"は、なぜprintfで45も表示されるのだろう?
0があると、そこで表示をやめるものだと教わりましたが、 char c[]="123045"; printf("%s\n",c); とやった所、123ではなく、123045が表示されました。 これはなぜなんでしょうか?
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- crew21
- ベストアンサー率26% (58/222)
で、これだけ皆さんが質問してくれて、質問者さんからの反応は? 。。。。こういうのって最低限の礼儀だと思うのだけど、こういうこと書くと削除依頼とかになるんだよなあ。。。。。。。。
- crew21
- ベストアンサー率26% (58/222)
たぶん下のコメントで答え出ちゃってると思うけど、私なりの表現で答えると、 0は0x30、NULLは0x00。 表示がとまる(文字列の終端と判断される)のはNULLの方。 質問者さんの言ってる 0 は 0x30 の方だから表示されてしまう。 もう少し書くと、"123045" の 5 の次にNULLがあるから(こういう記述をするとコンパイラが文字列の最後にNULLを用意してくれる)、123045で表示が止まるわけですよ。
- chirubou
- ベストアンサー率37% (189/502)
気持ちはすごく良く分かります。いろいろと回答が出ていて、その通りなのですが、補足したいと思います。 一言で言えば、「文字(コード)」と「数値」は違う、ということになりますが、特に 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 と書いてもプログラム的には全く同じなのですが、こうしてしまうとプログラムが大変読みにくくなってしまいます。 ということで「文字」と「数値」の違いをちゃんと理解してください。
- yphkz4063
- ベストアンサー率23% (34/144)
人に聞く前に自分で確かめましょう。 int i; char c[]="123045"; printf("%s\n",c); for( i = 0; i < 7; i++ ) printf( "%02x ", c[ i ] ); ゼロはどこに出てきました?
- asuncion
- ベストアンサー率33% (2127/6289)
C言語において、文字列の終端を表わすのは '0'ではなく'\0'です。 char c[]="123045"; というc[]の定義は、 char c[] = { '1', '2', '3', '0', '4', '5', '\0' }; と同義です。 これでおわかりになりますか?
- siro7aka7
- ベストアンサー率34% (18/52)
""←で囲っているため、中の内容は全て「文字」として 取り扱われます。 で、ASCIIコードを見ると、 0=0x00 NULL となります。 "0"=0x30 0 となります。 人間の見た目の「0」でも、コンピュータにとっては 全くの別物です。 NULLは文字列の終端=そこで終わり "0"は文字の「0」=NULLではないので終わらない 説明下手ですが・・・ ※URLはASCIIコードのURLです。
- heygoro
- ベストアンサー率34% (10/29)
>0があると、そこで表示をやめるもの ボクの勉強不足ならごめんなさいですが、上のような話しは聞いたことがありません。 それが可能だと、"0"を含めた数値文字列変数の確保ができなくなってしまいます。(端的にいうと、演算ができなくなります) 何か、重要なことが話から抜けていませんか? char型ということは、hex型で文字を表現することができます。 "123045"はsjisのhexで0x313233303435となります。 で、hex型には0x00という文字があり、これはnullをあらわしています。 C言語の世界では、文字列charの中にnullが存在していると確かにそこで文字列表現は終了します。(ちなみに、文字列にあえてnullを残しておきたい場合はバイナリ(hex)で文字列を扱います) どのように教わったのかもう一度整理してみてください。
- kokorone
- ベストアンサー率38% (417/1093)
char c; c = 0; c = "0"; は異なります。 前者は、NULLコードで、そこで文字列の終端となります。 後者は、文字コードで表記すると、0x30です。 したがって、文字として扱われるため、そのまま表示されます。