• 締切済み

キーボードからの入力・出力について

☆いつもお世話になります。☆ 下記のCのプログラムは、入力したものをそのまま表示します。 しかし、出力する直前の改行がされないんです。 #include <stdio.h> #include <string.h> int main(void) { char array[80] ; int c ; int s=0 ; printf("入力してください\n") ; for( ; ; ) { c = getchar( ) ; if ( c != EOF ) { array[s] = c ; s++ ; } else { array[s] = '\0' ; break ; } } putchar( '\n' ) ; /* ★この改行は?★ */ puts( array ) ; printf( "strlen(array)=%d\n", strlen(array) ) ; return 0 ; } キーボードから、 'A' 'B' 'C' 'D' 'E' 'F' 'G' 7文字の入力の後に コントロール+Z を入力します。 ----------------次のようになります。---------- 入力してください ABCDEFGABCDEFG strlen(array)=7 初めのABCDEFGはキーボードからの入力時に表示されたもので、 後のABCDEFGはputsで出力したものと思います。 私は2つのABCDEFGの間に改行が入るんじゃないかなあ~~と思うんですが、 なぜそうならないんでしょうか? VC++6.0でWin32 Console Applicationで作成しています。

みんなの回答

  • A__
  • ベストアンサー率47% (22/46)
回答No.4

EOFが0か255なら、それと同じ状況にしてみようと思って 下のソースをやってみたけど main() { printf("あああ") ; putchar(0); printf("いいい") ; putchar( '\n' ) ; printf("ううう") ; putchar(255); printf("えええ") ; putchar( '\n' ) ; printf("おおお") ; putchar(EOF); printf("かかか") ; putchar( '\n' ) ; printf("ききき") ; } あああ(半角スペースに見える)いいい ううう(黒い長方形)えええ おおお(黒い長方形)かかか ききき という結果だったから、また疑問が1つ増えてしまいました。

noname#2045
質問者

補足

う~~ん、この質問の件についてはあきらめモードに入っています。 しばらく締め切らないでおきますが、そういうものなんだ、で収めるしかないのかな、という感じです。 7月22日

  • A__
  • ベストアンサー率47% (22/46)
回答No.3

俺も納得できてないけど、コンソールにEOFが出力されると、 それ以降に \n が出力されるまでは出力されるはずの文字は消されてしまう っていうことは、色々試した実験結果からの仮定だから、定義されている 情報があれば見てみたいと思っています。 コンソールにEOFが出力されようとした場合、本当は 0 か 255 が 出力されている可能性が高そうだと後で思いました。 コンソールにEOFが出力されようとするとどうなのか っていうところがとても気になるところです。

noname#2045
質問者

補足

ありがとうございます。 何かわかったらお教えください。

  • A__
  • ベストアンサー率47% (22/46)
回答No.2

コンソールに出力されたのは、たぶん  入力してください(\n)  ABCDEFG(EOF\n)ABCDEFG(\n)  strlen(array)=7(\n) だと思いました。 コントロール+Z を押した時のEOF も、A、B、C とかの キーと同じように、コンソールに出力されています。 (EOF\n) のようになると、\n は改行にならないみたいです。 でも、(EOF\n) と出力することによって、その後の \n は 正常に動作するみたいです。  … } putchar( '\n' ) ; /* ★この改行は?★ */ puts( array ) ;  … これを、  … } putchar( '\n' ) ; /* ★この改行はEOFをつぶすため★ */ putchar( '\n' ) ; /* ★実際に改行させるためのもの★ */ puts( array ) ;  … にすれば思い通りになるかもしれません。 #include <stdio.h> int main(void) { printf("あああ") ; getchar( ) ; /* ★EOFを入れて実験★ */ printf("いいい") ; printf("ううう") ; putchar( '\r' ) ; printf("えええ") ; putchar( '\n' ) ; printf("おおお") ; return 0 ; } この結果は  あああおおお でした。 コンソールにEOFが出力されると、それ以降に \n が出力されるまでは 出力されるはずの文字を消してしまうみたいでした。

noname#2045
質問者

補足

ありがとうございます。 ご回答のとおりです。 でも、どうも私はなんかなぜそうなのか納得しかねるんです。。 そういうものだと思うしかないのでしょうか。

noname#11476
noname#11476
回答No.1

今手元にないから未確認ですが、 putchar('\r');putchar('\n'); として下さい。 一番によくprintf("\n")としている場合は、内部で "\r\n"に展開しています。 がputchar()や(確か)puts()などは展開しませんので。 MS-DOSのコンソールでは"\r\n"と2バイト改行文字が必要です。

noname#2045
質問者

補足

>putchar('\r');putchar('\n'); >として下さい。 質問のputchar( '\n' ) ; /* ★この改行は?★ */ の部分のことですね。 やってみました。改行しません。 >一番によくprintf("\n")としている場合は、内部で "\r\n"に展開しています。 printf("\n"); に変えてみましたが、かわりません。 >がputchar()や(確か)puts()などは展開しませんので。 putsが\nで改行しないかどうか、下のプログラムでやってみました。 #include <stdio.h> int main(void) { puts("プッツ\nで改行\nできる\nかな"); return 0; } ----結果---- プッツ で改行 できる かな ということで、putsで\nは改行します。 問題となっている改行部分 putchar( '\n' ) ; /* ★この改行は?★ */ を除くと、次のようになります。 ----結果---- 入力してください ABCDEFGstrlen(array)=7 ん? 出力しない? さらに(問題となっている改行部分をのぞいた上で)、 putsでなくてprintfで出力 printf( array ) ; とすると、 ----結果---- 入力してください ABCDEFG strlenがどうというものも表示されない。 質問のプログラムに戻して、 forの中のbreak;の直前に printf("breakの直前です。") ; を入れても、それが表示されない。 どうも、改行が来るまでは、食われちゃう(無視されちゃう)らしいのです。

関連するQ&A

専門家に質問してみよう