- ベストアンサー
配列について
プログラムで配列についてなのですが printf("配列sに20文字くらい入力してください。\n"); scanf("%s", s); printf("配列bに20文字くらい入力してください。\n"); scanf("%s", b); printf("入力したのは%sと%sですね?", s, b); というようなプログラムを実行し実際20文字くらい入れると文字がうまく表示してくれません。これは私のパソコンのメモリの問題でしょうか? ちなみに fprintf(fp, "%s\n%s", s, b); とすると、ファイルには正常に書き込まれています。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
文字コードがUTF-8のようですね。 UTF-8では仮名・漢字は3byte/1文字使うので、13文字(39byte)でぎりぎり、14文字(42byte)以上でバッファオーバーフロー、となります。 エラーメッセージから推測するに、開発環境はLinux + gccあたりですよね?
その他の回答 (7)
- asuncion
- ベストアンサー率33% (2127/6289)
>fflush(stdin); 標準入力に対してfflushするのは確か未定義動作であるように思います。標準出力に対してならば何も問題はなかったと思います。 rewind(stdin); の方がまだお行儀がよいのではないかと思います。
- D-Matsu
- ベストアンサー率45% (1080/2394)
#4を書き込んでしまってから気づいたのですが、 > fgets(s, 40, stdin); のあとにfflush(stdin);がないとsをオーバーフローさせようとしたあとで入力バッファが残ってしまうのでbが入力できませんね。 本題ですが、「1字が最大3バイトを消費する」ことを前提に多めにバッファ確保しておくしかないでしょう。 「20文字」前提なら60byte+αくらいとか。
- tatsu99
- ベストアンサー率52% (391/751)
>入力した文字が長くても表示出来る良い方法はあるのでしょうか? ありません。そのため、入力されるであろう文字数より、十分大きな領域をとっておきます。 char s[40]; char b[40]; を char s[65536]; char b[65536]; としてください。通常はこれで十分です。
- D-Matsu
- ベストアンサー率45% (1080/2394)
> scanf("%s", s); を fgets(s, 40, stdin); に(bも同様)置き換えてみて、動作を確認してみてください。 たぶん入力した文字全部が表示されない結果になると思うのですが……
お礼
御指摘通り変えましたところ、あ が配列sに13文字入力された時点で次の配列bに入力ができず、 ”あああああああああああああと”(最初に配列sに入力した13文字の あ のみが表示される) となります。 配列sに12文字の あ を入力、配列bに あ を13文字入力すると ”ああああああああああああとあああああああああああああ”(配列sに入力した12文字の あ と配列bに入力した13文字の あ が表示される。) となります。 さらに 配列sに12文字の あ を入力、配列bに あ を20文字入力すると ”ああああああああああああとあああああああああああああ”(配列sに入力した12文字の あ と配列bに入力した20文字の あ のうち13文字だけが表示される。) となりました。
- asuncion
- ベストアンサー率33% (2127/6289)
>全角で文字を入力するとある程度(13文字程度)でダメになるような感じ 例えば、s には何を、そして b には何を与えたときに Segmentation Fault のエラーが出ますか?
お礼
今実験でやってみた時、あああああああああああああ と配列sに入力、 あああああああああああああ と配列bに入力 結果は無事表示される。(あ が13文字のケース) あ が各々14文字だと配列sに入力した方が文字化けで表示されず。 あ が各々15文字だとSegmentation fault となるようです。
- asuncion
- ベストアンサー率33% (2127/6289)
当該のプログラムのコードを 省略せずに 全部見せてください。
お礼
#include <stdio.h> int main(void) { char s[40]; char b[40]; printf("好きな文字をいれて下さい。"); scanf("%s", s); printf("さらに好きな文字をいれて下さい。"); scanf("%s", b); printf("入力したのは%sと%sですね?", s, b); return (0); } ただ、半角英数字を入力すると正常に表示されましたが、全角で文字を入力するとある程度(13文字程度)でダメになるような感じでSegmentation faultrとなります。
- D-Matsu
- ベストアンサー率45% (1080/2394)
sとbはどう宣言していますか?
お礼
大変失礼しました。あせって書かないまま投稿してしまいました。 char s[40]; char b[40]; と宣言しております。
お礼
そうです!御指摘通りです。すごいですね! そうなんですか。入力した文字が長くても表示出来る良い方法はあるのでしょうか?