• ベストアンサー

改行のせい(?)で入力がうまくいきません

改行のせい(?)で入力がうまくいきません C言語でプログラムを組んでいるのですが 入力したいところが飛ばされてしまいます。 例えばプログラムの一部ですが int main(void) { char file_name[15]; char option[5]; while(1) { printf("0: Quit\n"); printf("1: Count the number of characters\n"); printf("2: Pass or fail\n"); printf("3: Prime numbers\n"); printf("Choose an option from above: "); scanf("%s", &option); if(option[0]=='1') { printf("Enter the external name of the file: "); gets(file_name); printf("The number of characters in the text file is %d.\n\n", countText(file_name)); continue; } else if (option[0]=='2') { passFail(); continue; のoptionで'1'と入力してリターンを押すと file_nameを入力する機会を与えてくれず、「ファイル名がない」と怒られて 終了してしまいます。 きっと改行のせいだと思うのですが、どうしていいのか分かりません。 最初はchar型にしてたのですがstring型にして 最初の一文字だけ見るようにしましたけどダメです。 getcharなんて使えないですよね…。 「改行 入力 LF」なんてキーワードで検索やってみたんですけど見つかりませんでした。 Windows XP, Visual C++ Version 5.0を使っています。 どなたか解決方法を教えて下さい。

  • ginkgo
  • お礼率94% (132/139)

質問者が選んだベストアンサー

  • ベストアンサー
  • pureh
  • ベストアンサー率69% (36/52)
回答No.2

fflush(stdin); を scanf の直後の行に挿入する(参考URL)。 または、 後ろの gets を scanf に置き換える。 http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/c/C-faq/C-faq-12.html の 12.18: をご覧ください。    

参考URL:
http://www.borland.co.jp/qanda/lang/l0002014.html
ginkgo
質問者

お礼

治りました(^O^)/ まぁ、そんなコマンドが用意されてるんですね。 なんか、トイレのフラッシュみたいですね(^.^) それならいっそscanfの仕様を変えてほしいんですが… そういう訳にもいかないんでしょうね。 両方のURLも良い参考になりました。 C-faqもあるんですね。Java-faqだけかと思ってました。 これからどんどん利用させてもらおうと思います。 ありがとうございました。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

scanfは非常に使い方が難しい関数です。初心者は使わないほうがいいでしょう。ちゃんとしたCの入門書なら「使うな」と書いてあるはずです。 1 リターン と入力したうち、scanf("%s",&option)では1だけが処理され、リターンは入力バッファに残ったままです。続いてgetsが実行されると残っていたリターンのみが入力された扱いになり、file_nameは空文字列になります。 scanfをfgets(option,sizeof option,stdin)に変えたほうがいいでしょう。 また、gets(file_name) も15文字以上入力した場合に他の変数の値を破壊したりプログラムが異常終了したりしますので、getsも(使い捨てプログラムでない限り)使ってはいけない関数です。fgetsを使って書き直すべきですが、改行文字の扱いの仕様が違うので、マニュアルでgetsとfgetsの仕様の違いを確認してください。 scanfの "%s" を "%s " か "%s\n" に変えると、入力内容によってはとりあえず期待の動作をするかもしれませんが、止めたほうがいいでしょうね。

ginkgo
質問者

お礼

scanfをfgets(option,sizeof option,stdin)に変えてみました。 sizeof optionを2にしたのですが症状は変わりませんでした。 sizeof optionを1にすると止まらなくなりました。 ←そりゃそうか(^^ゞ scanfの"%s"を"%s "に変えてみました。 私のVisual C++ではoptionのところで二回入力しないといけないみたいです。 二回目の結果は次のfile_nameに入るのですが 入力した後に"Choose an option from above: "と聞いてくるので ちぐはぐになってしまいます。 "%s\n"もまったく同様です。 私も検索していて「初心者はscanfを使うな」という記述を見つけました。 ただ、他の方法が見つからなかったんですよね。 本に載っているプログラム例にもscanfが使われていますし…困りましたね。 こういう面ではやっぱりJavaやC++の方がいいですね。 ありがとうございました。

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

>getcharなんて使えないですよね…。 なぜ? scanf("%s", &option); を option[0] = (char)getchar(); と変えてみてはいかがですか?

ginkgo
質問者

お礼

あ、使えましたね。 どうやらぁゃιぃ使い方をしていたようです…。 scanfに倣ってgetchar(&option);とか(恥) ただ、症状は同じで問題の解決には至りませんでした。 同じことをするのにいろんな方法があるのって 便利かと思いきや不便ですね…。 ありがとうございました。

関連するQ&A

  • 教えてください。C言語初心者です。

    #include <stdio.h> int main() { int sentaku,hakoA=0,hakoB,*kiroku[10]; char *name[10]; while (sentaku !=3){ printf("1:新規登録\n"); printf("2:データ確認\n"); printf("3:終了\n"); scanf("%d",&sentaku); switch (sentaku){ case 1: printf("登録する名前を入力してください。---"); scanf("%s",name[hakoA]); printf("記録を入力してください。---"); scanf("%d",&kiroku[hakoA]); printf("登録番号は%d番です。\n",hakoA); hakoA++; printf("登録を終了します。\n"); continue; case 2: if (hakoA==0){ printf("登録されてません\n"); continue; }else{ printf("登録番号を入力して下さい。---"); scanf("%d",&hakoB); printf("%s君で記録は%dです。\n",name[hakoB],kiroku[hakoB]); continue; } case 3: break; default : printf("1~3でお願いします。\n"); continue; } } return 0; } このプログラムはコンパイルされたのですが、実行で入力してるとエラーになってしまうのです。 まだ勉強始めたばかりでちょっとなぜか解らないのです。どこかおかしいところがありましたらご教授いただけると嬉しいです。おねがいします。

  • 10個出力で改行したいのですが・・・

    #include <stdio.h> main() { int i, n; for( i = 1, n = 0; n < i; i++ )    { if(i%3 == 2 && i%4 == 1 && i<1000 ) {  printf("%4d,",i);   if(i%10==0)        printf("\n");    n++;       }    } printf("\n"); } このプログラムは、3で割ると2余り、4で割ると1余る自然数で1000より小さいものを小さい順に表示するもので、 一行に10個ずつ表示して改行したいのですが、どうすればいいでしょうか? if文が間違っていると思うのですが・・・

  • 文字列の入力

    文字列(名前)と誕生日を読み込み、表示するプログラムです。文字列を読み込むときに空行を入力すると、読み込みを終了して表示するようにしたのですが、うまくいきません。読み込む時に使う関数が違うのだと思います。scanfとgets、fgetsは試したのですが、だめでした。 教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define DATA 3 int main() { char *name[DATA]; char work[31]; int month[DATA]; int day[DATA]; int count1,count2; printf("Data #1\n"); printf("name ="); fgets(work,31,stdin); for(count1=0;(work[0]!='\n')&&(count1<DATA);count1++){ printf("month ="); scanf("%d",&month[count1]); printf("day ="); scanf("%d",&day[count1]); name[count1]=(char *)malloc((strlen(work)+1)*sizeof(char)); strcpy(*(name+count1),work); printf("\n"); if(count1<DATA-1){ printf("Data #%d\n",count1+2); printf("name ="); fgets(work,31,stdin); } } for(count2=0;(count2<DATA)&&(count2<count1);count2++){ printf("Data #%d\n",count2+1); printf(" name: %s\n",*(name+count2)); printf(" birthday: %2d %2d\n",month[count2],day[count2]); } }

  • 10個で改行したいのですが

    int _tmain(int argc, _TCHAR* argv[]) { int i,n,j,w,m,; printf("素数は\n"); n=0; for(i=1; i<=2000; i++){ n=n+i; w=0; for(j=1; j<=i ;j++){ m=i%j; if(m==0){ w=w+1; } } if(w==2){ printf("%d、",i); } } return 0; } このプログラムは2000までの素数を出力するプログラムです。この結果の素数10個ずつで改行したいのですが、どうすればよいでしょうか? お願いします。

  • ファイルから一文字ずつ読み込む

    ファイルを読み込むfgetc()関数のところでプログラムが停止します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char name[],int a){ printf("ファイル名を入力してください。\n"); scanf("%s",name); } void open(FILE *fp2,char name[]){ if((fp2=fopen(name,"r"))==NULL){ printf("ファイルオープンエラー"); } } int count(FILE *fp3){ int ch=0; int count=0; if(fp3==NULL){ printf("error"); } while((ch=fgetc(fp3))!=EOF){ if(ch=='\n'){ count++; } } printf("TEST"); fclose(fp3); return(count); } int main (void){ FILE *fp; char fname[30]; get_name(fname,30); open(fp,fname); printf("%d",count(fp)); return(0);} ファイル名を入力してください。ファイル名を入力、プログラム停止です。 '\n'を数えれるようにしてください。御指摘お願いします。

  • scanfに文字が入力されたときにエラー表示させる

    こんばんは.C言語勉強中です. 以下にsizeofを用いて各データタイプのサイズを表示させるプログラムを作りました.プログラム全文は下に貼付けました.これは,1-7までのいずれかの数字を入力すると,それに対応したサイズが表示されます.1-7以外の数字が入力されると,Type 1 - 7, please,と表示され,再び数字を入力出来ます.このプログラムは数字を入力している間はうまく機能していると思います. ただ,文字を入力すると無限ループに陥ってしまいます.僕は以下の scanf("%d",&typed); で10進数で読み込んで, if(typed<1 || typed >7) とすれば,文字も含めて全ての入力に対して排除できるかと思ったのですが,これではダメなようです. こういう場合,どうやって文字の入力に対するエラーを表示させるのが一般的なのでしょうか? 素人質問ですみません.よろしくお願いします. #include <stdio.h> #include <stdint.h> #include <Windows.h> int8_t main() { int typed; while(1) { while(1) { printf("Type the data type you wanna know the size of\n"); printf("char 1, short 2, int 3, long 4, long long 5, float 6, double 7: "); scanf("%d",&typed); printf("What you typed is %d\n",typed); if(typed<1 || typed >7) { printf("Type 1 - 7, please\n"); Sleep(1000); continue; } else { break; } } printf("Data size is "); switch(typed){ case 1: printf("%d\n",sizeof(char)); break; case 2: printf("%d\n",sizeof(short)); break; case 3: printf("%d\n",sizeof(int)); break; case 4: printf("%d\n",sizeof(long int)); break; case 5: printf("%d\n",sizeof(long long)); break; case 6: printf("%d\n",sizeof(float)); break; case 7: printf("%d\n",sizeof(double)); break; default: printf("Unexpected Value!\n"); break; } Sleep(2000); } return(0); }

  • 16進数の入力プログラムについて

    16進数の入力プログラムについての課題が出たのですが作動しませんどこが間違っているか教えて頂けませんか #include<stdio.h> main() { int number; int ch; printf("please input: "); while(){ ch=getchar() if('\n'=ch) break; number=number*16; if('0'<=ch && ch<='9'){ number=number+(ch-'0'); } if('A'<=ch && ch<='F'){ number=number+(ch-'A'+10); } } printf("your input number is %d\n",number,number); }

  • Cプログラミング(文字入力)

    文字を二つ入力して、TかFであれば 1~3、それ以外は4を返すプログラムです。 下記のソースでは正常に動作しませんでした。 どの文法が間違っているか判らないので、 どなたか指摘頂けないでしょうか。 宜しくお願いします。 char a,b; printf("1つめの文字を入力してください-->"); scanf("%c",&a); printf("2つめの文字を入力してください-->"); scanf("%c",&b); if(a=='T'&&b=='T')   printf("結果:1\n"); else if((a=='T'&&b=='F')||(a=='F'&&b=='T'))   printf("結果:2\n"); else if(a=='F'&&b=='F')   printf("結果:3\n"); else   printf("結果:4\n");

  • 入力ファイルのデフォルトの設定

    下のソースは入力ファイルの内容が例えば、 1 2 3 4 5 6 7 8 の時にその内容を出力するものです。 入力ファイル名がinput.datの場合、プログラム実行後にinput.datと入力し、Enterを押します。 このプログラムにinput.datをデフォルトとし、空Enterで入力を実行できるようにしたいと考えています。 入力ファイル名がinput.datでない場合は従来通りファイル名を入力してEnterを押すようにします。 この場合、どのようにソースを変更すればよいでしょうか。お手数ですが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(){ int i,N=0,data[10]; char ifile[20]; FILE *fp; printf("input file name: "); scanf("%s",ifile); if((fp=fopen(ifile,"r"))==NULL){ fprintf(stderr,"input file error\n"); exit(1); } while(fscanf(fp,"%d",&data[N])!=EOF && N<10){ N++; } printf("Total Number of Data = %d\n",N); for(i=0;i<N;i++){ printf("%d\n",data[i]); } fclose(fp); return 0; }

  • 改行について パート2

    改行には\nを使いますがfor文やif文をたくさん使う場合のときはいったいどこに「3つごとに改行」などのif文を入れたらよいですか。 素数を100まで求めるとするとき以下のプログラミングになると思いますが。 #include <stdio.h> main() { int i,n; for (n == 2 ; n <= 100 ; n++){ for (i=2; i<n ;i++){ if(n%i == 0){ break; } } if(i == n){ printf("%d ",i); } } } では、3つごとに表示するときは   if(i%3==0){ printf("\n"); } と、文はこうなると思います。これはどこに書き加えたらいいですか

専門家に質問してみよう