• ベストアンサー

なぜかわかりませんscanf()の戻り値で迷ってます。

ある本にscanf()の書き方が書いてあってそれを入力してもエラーが表示されてわかりませ。 使用ソフトはMicrosoft Visual c++です。どこが間違っているのか教えてください。 #include <stdio.h> #include <stdlib.h> int main (void) { int score[10]; int status; int temp_score; int score_count; int i; /*配列に位に入力*/ score_count = 0; while(1){ status=scanf("d",&score_count); if (status == EOF ){ break; }else if (status != 1){ fprintf(stderr ,"入力エラー\n"); exit(1); } if (score_count >= 10 ){ fprintf( stderr,"データ件数が多すぎます\n"); exit(1); } score[score_count] =temp_score; score_count++; } } /*配置の内容を表示する*/ for(i=0 ;i < score_count;i++){ printf("score[%d]..%d\n",i,score[i]); } return (0); }

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

  • ベストアンサー
  • mneko
  • ベストアンサー率33% (46/139)
回答No.4

先ほどの補足です、status=scanf("d",&score_count); のcore_countでなくてtemp_scoreでは有りませんか? それと、score_count++; の次に「}」が2つ有りますが1つ要りません。 1つ多いです。 以上です。

その他の回答 (3)

  • mneko
  • ベストアンサー率33% (46/139)
回答No.3

timberさんが回答されている方の通り、int score_count; に標準入力からの場合は "%d"です、それとこのそースプログラムですと、標準入力から整数型変数 score_countに入れて配列の添字に使っており、その後インクリメントされて いるのはおかしいです、それと一次元配列score[score_count] に代入しているのがint temp_score;になっていてこの変数にはこのソース内で 代入などされていないし、初期値も無いので代入される値は不定値が一次元配列に 入ります、処理内容がいまいち納得できませんが! status=scanf("d",&score_count);        ↑        %が抜けてます。これでエラーはなくなります。

kimaira
質問者

お礼

そこが抜けていたみたいですね(^^;) 今やってみたらできました。どうもありがとうございます。

  • timber
  • ベストアンサー率29% (218/739)
回答No.2

補足です。 MSDNによると 戻り値が 0 の場合は、代入されたフィールドがなかったことを示します。 とのことです。 status=scanf("d",&score_count); のままだと代入が行われませんので statusは常に「0」。 したがって、何を入力しても「入力エラー」となります。

kimaira
質問者

お礼

できました、scanfの%と&はすぐに忘れてしまうんで・・(これから気をつけないと)質問の回答ありがとうございます。勉強になりました。

  • timber
  • ベストアンサー率29% (218/739)
回答No.1

whileの後 status=scanf("d",&score_count); じゃなく status=scanf("%d",&score_count); だと思いますが。 会社に行かないとVCないんで火曜日にならないと検証はできないんですけど。

関連するQ&A

  • 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になっているのかわかりません。 入力バッファに何か残ってしまっているということなのでしょうか? 以上教えていただけると嬉しいです。

  • 合ってるのか合ってないのか。C言語

    これで正解なのかどうなのか・・・ 関数sub()を作ってプログラムを完成させよ。 この関数は、第1引数で与えられた引数の配列の要素の、 第2引数から第3引数までの要素の合計の値を返すものである。 例えば、0と0を入力したら結果は1、3と4を入力したら、16となる ものである。 main内部のfprintf文のxxxxxxxxxxxxxxxxxxxxxxxxの部分には、 エラーの意味が分かるようにエラーメッセージを書いておくこと。 0と0入力したら2だと思うのですが、これは問題のミスでしょうか コード↓ #include <stdio.h> #include <stdlib.h> #define BUFMAX 12 int sub(int [],int,int); int main() { int a[BUFMAX], start, end; a[0] = 1; a[1] = 3; a[2] = 5; a[3] = 7; a[4] = 9; a[5] = 11; a[6] = 2; a[7] = 4; a[8] = 6; a[9] = 8; a[10] = 10; a[11] = 12; scanf("%d", &start); scanf("%d", &end); if (start < 0 || start >= BUFMAX) { fprintf(stderr, "start no atai ga okasii desu.\n"); exit(1); } if (end < 0 || end >= BUFMAX) { fprintf(stderr, "end no atai ga okasii desu.\n"); exit(1); } if (end < start) { //fprintf(stderr, "xxxxxxxxxxxxxxxxxxxxxxxxxxx.\n"); fprintf(stderr,"start ga end yori ookii no de error desu.\n"); exit(1); } printf("%d\n", sub(a, start, end)); exit(0); } int sub(int a[],int start,int end) { int i,atai; for(i=0;i<BUFMAX;i++) { atai = a[start]+a[end]; } return atai; }

  • ファイル

    c言語初心者です。 どなたか教えていただけませんか? これだとiが定義されないことになってしまいます。 #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; fp=fopen("monai", "w"); if(fp==NULL){ fprintf(stderr,"ファイルのオープンに失敗しました。\n"); exit(0); } int i; for(i=1;i<=30;i++) { if(i<=9){ fprintf(fp," %d ",i); } else if(i%10==0) { fprintf(fp,"%d\n",i); } else { fprintf(fp,"%d ",i); } } fclose(fp); return 0; } ビルドもできません。

  • 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) { char c; int i; printf("0を入力すると終了します。\n"); while(1) { printf("文字を入力してください=>"); scanf("%c",&c); printf("入力した文字は %c です。\n",c); printf("数字を入力してください=>"); scanf("%d",&i); if(i==0) { break; } printf("入力した数字は %d です。\n",i); } return 0; } ---------------------------------------------------------------- 上のコードを実行すると、初回はscanf()はcharとintの両方とも 入力待ちになってくれるのですが、2回目以降はcharは入力待ちに なってくれません。これは、なぜなのでしょうか? ご教授お願いします。 現在VC++6.0を使用しております。

  • c言語初心者です

    うまくできません C言語プログラム初心者です 問題で 関数sub()を作ってプログラムを完成させよ。 この関数は、第1引数で与えられた引数の配列の要素の、 第2引数から第3引数までの要素の合計の値を返すものである。 例えば、0と0を入力したら結果は1、3と4を入力したら、16となる ものである。 main内部のfprintf文のxxxxxxxxxxxxxxxxxxxxxxxxの部分には、 エラーの意味が分かるようにエラーメッセージを書いておくこと。 #include <stdio.h> #include <stdlib.h> #define BUFMAX 12 int sub(int [],int,int); int main() { int a[BUFMAX], start, end; a[0] = 1; a[1] = 3; a[2] = 5; a[3] = 7; a[4] = 9; a[5] = 11; a[6] = 2; a[7] = 4; a[8] = 6; a[9] = 8; a[10] = 10; a[11] = 12; scanf("%d", &start); scanf("%d", &end); if (start < 0 || start >= BUFMAX) { fprintf(stderr, "start no atai ga okasii desu.\n"); exit(1); } if (end < 0 || end >= BUFMAX) { fprintf(stderr, "end no atai ga okasii desu.\n"); exit(1); } if (end < start) { fprintf(stderr, "xxxxxxxxxxxxxxxxxxxxxxxxxxx.\n"); exit(1); } printf("%d\n", sub(a, start, end)); exit(0); } int sub(int a[],int start,int end) { int atai atai = a[start]+a[end]; return atai; } if文で同じ値の場合・・・などと考えたのですが、手付かずです よろしくお願いします

  • scanf関数について

    scanfで数字を入力し「CTRL+D」で入力終了となるプログラムを考えています. 調べてみると以下の様なプログラムでは入力終了となります. #include <stdio.h> int main(void) { int a[256]; int i = 0; while(1) { printf("Input%d = ", i); if ( scanf("%d", &a[i]) == EOF || i > 255) { break; } i++; } return 0; } しかし,次の様にすると「CTRL+D」では終了しません. #include <stdio.h> int main(void) { int a[256]; int i = 0; while(1) { printf("Input%d = ", i);   scanf("%d", &a[i]); <-----追加 if ( a[i] == EOF || i > 255) {   <-----変更 break; } i++; } return 0; } この場合は,環境がUNIXのため「-1」と入力すると終了します. 2種類の違いが分かりません. 教えてもらえないでしょうか?

  • C++のscanfについて

    今C++をやり始めたばかりの者です 下記のように打って、コンパイルして実行すると、数字はちゃんと出るんですが英語は入るとループがかかってしまいます。 英語のループを回避して、平均が出るように出来ないでしょうか。。。。 返答よろしくお願いします。。。。。 /********************************************** 平均を求める ***********************************************/ #include <stdio.h> #define END -1 //-1が入力されたら終わり void main() { //変数の宣言 int score; //得点 int total; //合計 double ave; //平均点 int i; //回数のカウント //入力と合計の計算 total = 0; //初期設定 i = 0; //最初の得点を入力 printf("%d科目めの得点を入力 : ", i+1); scanf("%d" , &score); //入力 while( score > END ) { total += score; i++; printf("%d科目目の得点を入力 : ", i+1); scanf("%d" , &score); //次を入力 } ave = (double)total / i; //平均を求める //表示 printf("合計:%5d点 平均:%7.1lf点\n" , total , ave); }

  • scanfの謎

    C言語の以下のプログラムがありまして、 #include <stdio.h> main() { int i; scanf("%d ", &i);printf("d=%d\n", i); } これを実行すると、 1 2 d=1 のように、入力を2回受け付けてしまいます。 一体なんでこのようなことが起こるのでしょうか?教えてください。

  • 至急!教えてください。

    #include <stdio.h> #include <windows.h> #define COUNT (3) struct Seiseki{ char name[20]; int score1; int score2; int score3; int score4; int score5; int average; }; int getValue(char str[], char temp[], int n){ memset(temp, 0, 19); while(*(str+n) == ' '){ n++; } int i = 0; while(*(str+n) != ' ' && *(str+n) != 0){ temp[i] = *(str+n); i++; n++; } return n; } void getAverage(Seiseki *seiseki){ int total = seiseki->score1 + seiseki->score2 + seiseki->score3 + seiseki->score4 + seiseki->score5; seiseki->average = total / 5; } void getSeiseki(Seiseki seiseki[]){ char temp[20]; char str[256]; for(int i = 0; i < COUNT; i++){ printf_s("%d 人目の点数と名前 > ", i+1); memset(str, 0, 255); gets(str); int n = 0; n = getValue(str, temp, n); strcpy(seiseki[i].name, temp); n = getValue(str, temp, n); seiseki[i].score1 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score2 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score3 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score4 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score5 = atoi(temp); getAverage(&seiseki[i]); } } void showSeiseki(Seiseki seiseki[]){ for(int i = 0; i < COUNT; i++){ printf("%d %s %d %d %d %d %d\n", i+1, seiseki[i].name, seiseki[i].score1, seiseki[i].score2, seiseki[i].score3, seiseki[i].score4, seiseki[i].score5, seiseki[i].average); } } void showScoresAverage(Seiseki seiseki[]){ int total1 = 0; int total2 = 0; int total3 = 0; int total4 = 0; int total5 = 0; for(int i = 0; i < COUNT; i++){ total1+=seiseki[i].score1; total2+=seiseki[i].score2; total3+=seiseki[i].score3; total4+=seiseki[i].score4; total5+=seiseki[i].score5; } int ave1 = total1 / COUNT; int ave2 = total2 / COUNT; int ave3 = total3 / COUNT; int ave4 = total4 / COUNT; int ave5 = total5 / COUNT; printf_s("\naverage %d %d %d %d %d\n",ave1, ave2, ave3, ave4, ave5); } void main(){ Seiseki seiseki[COUNT]; printf_s("生徒 %d 名分の成績を入力してください:\n", COUNT); getSeiseki(seiseki); printf_s("\n成績表\n# NAME #1 #2 #3 #4 #5 average\n"); showSeiseki(seiseki); showScoresAverage(seiseki); } 間違っている点がありますか? ありましたらどこに入れるか教えてください。 改良点などありましたらお願いします。

専門家に質問してみよう