• 締切済み

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

☆いつもお世話になります。☆ 下記の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で作成しています。

noname#2045
noname#2045

みんなの回答

  • 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

  • C言語について

    #include <stdio.h> int main(void) { printf("123456\tABC DEFGHIJK\n"); printf("2006/4/14\n"); printf("programing\n"); } のprintfをすべてputsに書き換えてコンパイル・実行すると、 #include <stdio.h> int main(void) { puts("123456\tABC DEFGHIJK\n"); puts("2006/4/14\n"); puts("programing\n"); } になると思うんですけど、そのputsを用いて上のprintfを用いたプログラムと同じ出力を得るにはどのようなプログラムに変えればいいのでしょうか?

  • c言語の文字列の逆順のプログラムがわかりません

    文字列を逆順して出力するプログラミングがわかりません。 #include <stdio.h> #include <string.h> void reverse(char *moji, char *gyaku); int main(void) { char x[30]; char y[30]; puts("文字を入力してください。\n"); scanf("%s", x); reverse(x, y); printf("逆順すると%sです。\n", y); return (0); } void reverse(char *moji, char *gyaku) { int i, len; len = strlen(moji); gyaku = moji + len - 1; for(i = 0; i < len; i ++){ putchar((int)*gyaku); gyaku--; } } 理想とする実行結果は 文字を入力してください。 abcdefg 逆順するとgfedcbaです。 なんですが、 上記のソースを実行すると 文字を入力してください。 abcdefg gfedcba逆順すると(謎の漢字)です。 となります。 どこがおかしいんでしょうか? よろしくおねがいします。

  • どこがちがうのでしょうか?

    以下の二つのプログラムはユーザーが文字を入力し、80文字以下なら ピリオドを追加して表示するというものです。上はうまくいきますが、下はうまくいきません。なぜでしょうか? #include<string.h> #include<stdlib.h> int main() { char str[80]; int i; printf("文字列を入力してください。\n"); gets(str); if(strlen(str)<80) { for(i=strlen(str);i<79;i++) strcat(str,"."); } printf("%s",str); } #include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char str[80]; int i; printf("文字列を入力してください。\n"); gets(str); if(strlen(str)<80) { for(i=strlen(str)+1;i<79;i++) str[i] = "."; } printf("%s",str); }

  • c言語のファイル出力について

    現在C言語の課題に取り組んでおり、ファイルの中身通りに出力させたいのですが 「ファイルの中身」 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 「出力結果」 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 こういう形で改行されて出てきてしまいます。 どなたか修正点を教えて頂けないでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int r,i,n; FILE* fp; char sin[9][1000]; fp = fopen("log.txt", "r"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } for (i = 0; i < 9; i++) { fscanf(fp, "%s", &(sin[i])); } fclose(fp); for (i = 0; i < 9; i++) { printf("%s\n", sin[i]); } return 0; }

  • strlen=がなかったら表示はどうなりますか!?

    #include <stdio.h> #include <string.h> int main() { char mojiretsu[10]; int nagasa; mojiretsu[0] = 'A'; mojiretsu[1] = 'B'; mojiretsu[2] = 'C'; mojiretsu[3] = '\0'; printf("%s\n", mojiretsu); nagasa = strlen(mojiretsu); printf("strlen=%d\n", nagasa); }  私のPCはgccプログラムがうまく働いていません 。   なのでコンパイル後の結果が分かりません。     以上のプログラム表示結果は参考書では    ABC strlen=3    です。  それで  "strlen=%d\n" を"%d\n"にしたら    表示結果は    ABC     3     となるのでしょうか!?  よろしくお願いします。  

  • 0と1のファイルへの書き込み、出力

    c言語で0と1の乱数を生成し、ファイルに出力したいのですが、出力がおかしくなってしまいます。 正しく0と1をファイルに書き込み、出力するにはどうしたらいいでしょうか。 わかる方いらっしゃいましたら教えてください。 お願い致します。 #include<stdio.h> #include <stdlib.h> #include <time.h> #define max 3000000 #define nrand(n) (int)((double)n*rand()/RAND_MAX) /* 0以上n未満の整数を返す */ int main() {   FILE *Wf;   char W_filename[20];   int *W=(int *)malloc(sizeof(int) * max);   printf("入力ファイル名 : "); scanf("%s",W_filename);   if( ( Wf=fopen(W_filename,"w") ) == NULL ) printf("ファイルを開けません\n");   else   {     for(i=0;i<max;i++)     {     W[i]=nrand(2);     fprintf(Wf,"%d ",W[i]);    }   }   fclose(Wf);   free(W); } 出力が ‰‱‱‰‱‱‰‱‱‰‰‰‰‱‰‱‰‱‰‰ のようになってしまいます。 Wにはちゃんと0か1が入っているみたいなのですが・・・

  • abcdとキーボードで打ったらdcbaと表示されるプログラム

    C言語に関しては初心者です。 メイン関数は変更せずに行います。 /* reverse.c: reverse a given string */ #include <stdio.h> #include <string.h> void reverse(char *); /* プロトタイプ宣言 */ int main(void) { char str[100]; scanf("%s", str); reverse(str); printf("%s\n", str); return (0); } void reverse(char *s) { char n; int i; char str; n = strlen(str) - 1; for(i=0,i++,i<=100) { s[i] = *s[n-i]; printf("%s\"s[i]); } }

  • ポインタ勉強中です。しかも実行するとおかしいです。

    <本に載ってたソース> #include<stdio.h> #include<string.h> int main() { char msg[20]; char *str=NULL; int i; int cnt; str=&msg[0]; printf("文字を入力してください"); scanf("%s",&str); cnt=strlen(msg); str=msg+cnt; for(i=cnt;i>=0;i--){ printf("%c",*(str--)); } printf("\n"); return 0; } char *str=NULL;は、ポインタstrを空にするということでしょうか? いつもながらstrlenとsizeofが混じります。 sizeofがバイトの大きさで、strlenが、文字数でしたっけ?

  • 入力制御

    c言語初心者です。 以下のプログラムをみてください。 #include<stdio.h> int main() { char ch[3]; fgets( ch, 3,stdin );   if(ch[0]=='3') { printf("Hello!\n"); } else if(ch[0]=='2') { puts("回る"); } else{ puts("間違いf"); } return 0; } このプログラムでは2を入力すると"回る"と表示されますが 2wでも同じように表示されてしまいます。 制限して2wで入力したら"間違い"と表示させたいのですがなかなかうまくいきません。 どなたか教えてください。

  • 入力した値をファイルに出力するプログラム

    C++でscanfなどで入力した値をファイルに出力するプログラムを作りたいのですがうまくいきません。下記のプログラムを書いてみたのですが入力した値を出力することができませんでした。どこを変更すればいいのかわかる方がいましたらご指導よろしくお願いします。 #include<iostream> #include <fstream> using namespace std; int main( ) { char ch; char ss[10]; int dt; int i,p; ofstream fileout; // 出力用ストリームの宣言 ifstream filein; // 入力用ストリームの宣言 fileout.open("sampledata.txt"); // 出力ファイルをオープン if (!fileout) // エラー処理 { cout << "エラー!出力ファイルをオープンできません\n"; return 1; } printf("IDを入力してください:"); scanf("%s",i); printf("\nパスワードを入力してください:"); scanf("%s",p); printf("\n登録しました。"); fileout << "ID=%d PASS=%s\n",i,p; // 文字列データ出力 fileout.close(); // 出力ファイルをクローズ filein.open("sampledata.txt"); // 入力ファイルをオープン if (!filein) // エラー処理 { cout << "エラー!入力ファイルをオープンできません\n"; return 1; } filein >> ch; // 文字データ入力 filein >> ss; // 文字列データ入力 filein >> dt; // 数値データの入力 cout << ch << '\n'; cout << ss << '\n'; cout << dt << '\n'; filein.close(); // 出力ファイルをクローズ return 0; }

専門家に質問してみよう