• ベストアンサー

scanfについて

こんにちわ。 今Cのプログラムを勉強しているんですが, puts("入力します:"); if (fscanf(stdin,"%s", name) == EOF) { puts("エラーです"); } では,改行のみの場合に,何も返さずにもう一度fscanfが読み込まれますよね。 (fscanfは改行のみの場合はそれ自身の関数が再度呼ばれると思うんですが・・・) これを改行もエラーとして表示するにはどうすればよろしいでしょうか。 ただし,入力文字は2文字以上です。 他の入力関数を用いることになってもいいんですが,わかる方,よろしくおねがいします。

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

  • ベストアンサー
回答No.3

No1です たびたびすみません。アスキーコードのミスです。 while(*fgets(str,255,stdin) < 0x21) ; これでアスキーコード0x21以下は無視します。 もし、エラーコードを返したいのであれば if (!(*fgets(str,255,stdin) < 0x21)) { //エラー } こんな感じでしょうか。

その他の回答 (2)

回答No.2

No1です。 追記 while(*fgets(str,255,stdin) < 0x41) ; こんな感じでどうでしょう。

回答No.1

fgets(str,255,stdin); fscanfは改行を空白として無視します。原因はそこでしょうね。 上記fgetsは改行コードも文字列に格納します。 (引数は左から「格納先配列ポインタ」「バイト数」「stdin」) 改行コードが入っている事を忘れずにお使いください。

yu393939
質問者

補足

ただ,これだと,たとえば, puts("入力します:"); if (fgets(name,20, stdin) == NULL) { puts("エラーです"); } とうつと,改行はエラーを返してくれません。 どうしたらよろしいでしょうか。

関連するQ&A

  • scanfの後のfgetsについて

    #include <stdio.h> int main(void) { char name[10]; int no; printf("ナンバーを入力してください: "); scanf("%d",&no); /* 35を入力 */ printf("文字列を入力してください: "); fgets(name,10,stdin); /*入力できない*/ return 0; } この例文だと、fgets関数が改行コードを読み取って、終了してしまい文字列入力が出来ないみたいなんですが、scanfの後にfgetsを使うような(scanfとfgetsの間にscanfの残した?改行コードを取り除く方法)処理はどのような方法があるのでしょうか? 試しにfgets文を2度書いたら思っていた動作をしてくれたのですが、はたしてfgets文を2度書くというような事をしていいものなのでしょうか?見た目もなんだか変な感じですし。。↓ #include <stdio.h> int main(void) { char name[10]; int no; printf("ナンバーを入力してください: "); scanf("%d",&no); /* 35を入力 */ printf("文字列を入力してください: "); fgets(name,10,stdin); fgets(name,10,stdin);  /*入力できる*/ return 0; }

  • strlen

    c言語初心者です。 10文字以上入力すると警告してくれるプログラムを考えています。 一応文字数を制限するにあたりstrlenを使おうとしてるのですが 思ったように機能してくれません。 以下が私の書いたプログラムです。 void main() { char name[10]={0}; memset( name, '\0', sizeof(name) ); loop: puts("*****登録*****"); printf(" 名前 :"); fgets(name,10,stdin); //バッファクリア**// if(strchr(name,'\n') == NULL) { while(getchar() != '\n'); } if(strlen(name)>10) { puts("<<文字入力数が多すぎです>>"); fgets(name,10,stdin); //バッファクリア**// if(strchr(name,'\n') == NULL) { while(getchar() != '\n'); } system("cls"); goto loop; } else { puts("OK"); } } よろしくお願いします。

  • scanf関数について

    こんなプログラムがありました。 char str[80]; while(scanf("%s",str)>=1){    ・・・  } このwhileループは何が入力されたときに終了するのですか?scanf関数は入力された文字を返り値に持つとわかったので、改行コードを入力しましたが、終了しませんでした。どうすればよいのでしょう。よろしくお願いいたします。

  • fgets関数とscanfについて

    fgets関数とscanfの意味が似ていると思うんですが、違いは何ですか? 例えば、fgets( str, 81, stdin ) は変数strに80文字制限で、標準入力から入力するという意味ですよね? scanf("%s",s)は変数sに文字列を入力するという意味ですよね? 意味が似てると思うんですが、実際は何が違うんでしょうか? 回答よろしくお願いします。

  • 入力されたとき,何も入力しない,もしくは20字以上だと再入力のプログラム??

    こんにちわ, 今Cの勉強をしているんですが,入力をして,何も入力しないもしくは20字以上だと再入力させるのプログラムを作りたいんですけどどうしたらよろしいでしょうか。 char sk[21]; start1: while(stdin = " puts("入力"); if ((*fgets(sk,sizeof(sk),stdin) < 0x21) || strlen(sk) >= 21 ) {   puts("error");   goto start1; } だと,20字以上のときにstdinのバッファに残ってしまってエラー表示が2度出ます。 ちなみにfflush(stdin)は使用できないANSI C規格です。 よろしくお願いします。

  • getsをscanfで書き直すにはどうしたらよいですか?

    現在。行数を数えるプログラムを例をみながらエディダに入力してコンパイルしてみたのですが、gets関数ではエラーが出てそれ以上すすまないです。 他の掲示板なんかをみると、getは危険だからscanfを使うといいですよと書いてあったのですが、書き換えかたがよく分からないのです。 *以下が問題にしているソースです。 /* ************************************* */ /* */ /* 行を数えるプログラム */ /* */ /* ************************************* */ #include <stdio.h> #include <stdlib.h> void main(void) { FILE *fp; char fname[256]; int c; int count; printf("ファイル名:"); if (gets(fnama) == NULL) { /* この部分 */ printf("入力エラーが発生しました。\n"); exit (-1); } if ((fp = fopen(fname,"r")) == NULL) { printf("ファイル '%s'をオープンできませんでした。\n",fname); exit (-1); } while ((c fgetc(fp)) != EOF) { if (c == '\n') { count++; } } printf(">>> ファイル %s は %d 行です。\n",fname,count); fclose(fp); }

  • scanf関数の戻り値について

    --------------------------------------- #include<stdio.h> int main(void) { int dt; while(scanf("%d",&dt)==1){ if(dt==0){ printf("0は入力しないでください\n"); puts(""); } else if(dt<0){ dt=-dt; printf("入力値の絶対値は「%d」です\n",dt); puts(""); } else{ printf("入力値の絶対値は「%d」です\n",dt); puts(""); } } return 0; } --------------------------------------- 以上のプログラムについて疑問があります。 scanf関数の戻り値が1の間、繰り返すというもので、入力の時に整数入力ですが、あえて実数である1.1を入れたとします。 scanfの戻り値は1で、dtには整数部の1だけ設定されていたので、これでもうまくいくのかと思ったのですが、次の入力はscanfの戻り値が0になっていて出来ませんでした。 何故0になっているのかわかりません。 入力バッファに何か残ってしまっているということなのでしょうか? 以上教えていただけると嬉しいです。

  • fscanf/fprintfでのファイルの読み書き

    以下のようなプログラムでファイルを使ったデータの読み書きをしているのですが、 fscanfの所で永久ループになってしまい、またファイルの最後の部分のみを 出力するという動作になってしまい困っています。 ソースを何度読み直してもどこがおかしいのかわかりません。 何か心当たりのある方どうかご教授下さい。お願いいたします。 #include <stdio.h> #include <stdlib.h> void main() { char in_name[10]; int in_ten,w_goukei=0; FILE *gf_pt; if((gf_pt=fopen("gakusei.dat","w+"))==NULL) { printf("FILE OPEN ERROR\n"); exit(EXIT_FAILURE); } printf("データを入力してください(終了は^Z)\n"); rewind(stdin); while((scanf("%s %d",in_name,&in_ten))!=EOF) fprintf(gf_pt,"%-10s %3d",in_name,in_ten); printf("\nデータを表示します\n"); rewind(gf_pt); while(fscanf(gf_pt,"%-10s %3d",in_name,&in_ten)!=EOF) { w_goukei+=in_ten; printf("%-10s %3d\n",in_name,in_ten); } printf(" %4d\n",w_goukei); if(fclose(gf_pt)==EOF) { printf("FILE CLOSE ERROR\n"); exit(EXIT_FAILURE); } }

  • c language

    while ((del = fscanf(f,"%s %d %d",name,&arr,&leave)) != EOF) { //printf("%s %d %d\n",name,arr,leave); if(name[i] == '#'){ printf("%s",name); }else if(name[i] == '@'){ printf("%s",name); } i++; } ファイル読み込みで dAA 1 2 B 2 3 dfee 56 8 gtr 21 0 @ 23 5 このように'文字列' '数字' '数字' のように並んでいるのが縦に何行かあります。 それを 文字列の部分が@だったら〜など判定するにはどうすればいいですか? 一応ファイル読み込んで全てプリントしてその後にifで判断しようと思ったのですがうまく行きませんでした。

  • scanf関数について

    scanf関数で、下記のように書いたとき char ss[10]; scanf("%s", ss); printf("ss=%s\n", ss); ssは9文字までしかはいりませんが、入力時に10文字以上入力したら、prinitf関数でちゃんと入力した(10文字以上)の文字を表示してくれました。 これは、ssの容量を越えた分のメモリを確保してくれているのですか?

専門家に質問してみよう