質問: {"Japan","OK","TEST"}; for(int i=0; i<3; i++){ printf("%s", str[i]); } } ``` ### 補足情報(言語/FW/ツール等のバージョンなど) paiza.io
回答: そもそものchar配列とprintf()について理解が旨く出来ていないと思うんですけども... 大前提として,先のお二方の仰る通り,C言語に文字列型が存在しない,というところまではわかりました? とはいえ,文字列を扱うことなんて日常的にありますので, ・charの配列に文字列をしまう ・その終わりはNULL文字(\0 , 0x00)である というルールを設けました. ですので,まずは2次元配列を無視し1次元の配列での文字列を考え, ``` char str[128] = "Japan"; //※1 printf("%s", str); //※2 ``` とした場合,※1では,str[0]から始まる128個の配列に 'J','a','p','a','n','\0',...(この後は不定) の6つの文字が入り,※2ではその先頭のアドレスが渡されたことにより,printf()が「'\0'までを表示する」というルールに基づいて表示してくれます(printfの動作はドキュメントを読んでみてください,たぶん2つめの引数にアドレスをよこせ,と書いてあると思います). さてさて.2次元配列になりましたら,どこかのアドレスを目安にループしなくちゃなりません. それが今回の本題である str**[3]**[128]なわけです. ``` char str[3][128] = {"Japan","OK","TEST"}; for(int i=0; i<3; i++){ printf("%s", str[i]); //※3 } ``` ここは先の指摘の通り,間違ったポインタ宣言を外してありますが,※3のところでstr[i]と表記しているところは,上の1次元配列で表示できた時に省けた[128]部分が無いだけ,と考えてもらったら分かりやすいと思います. str[0]→'J','a','p','a','n','\0',...(この後は不定) str[1]→'O','k','\0',...(この後は不定) str[2]→'T','E','S','T','\0',...(この後は不定) もちろん質問者さんの言うとおり,charの1次元配列を馬鹿正直にループして一文字ずつ表示する,ということも出来なくはないのです.が,それではprintfを使う必要がなくなってしまうのです. したがって,printf()は上記のように charの配列をループせずに一度に表示してくれる関数だから と考えてもらえばイイんじゃないでしょうか. もしかしたら変数の扱いがふわっとしていることが理解を妨げているのかもしれません.