C言語のfor文について

このQ&Aのポイント
  • C言語のfor文について説明します。
  • プログラムの実行時にキー入力が省略される問題が発生しています。
  • 正常な動作をするためにはどのように修正すればいいかを教えてください。
回答を見る
  • ベストアンサー

C言語のfor文について

閲覧有難うございます。さて本題ですが、以下のプログラム #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <Windows.h> #define S 500 int main(void) { unsigned char x, input; int i; for (i = 0; i < 20; i++) { x = 0x01; scanf("%#x", &input); Sleep(S); printf("%#x\n", x); } return 0; } を実行したら、一度だけキー入力をした後はキー入力の処理は飛ばされ、 最初に入力した値がi < 20までループが続くのですが・・・ 正常な動作としては キー入力  ↓ スリープ  ↓ 入力値を出力  ↓ 再びキー入力 となるはずですよね?しかし何故か2回目以降のscanf()が省略されるのは何故でしょうか? 環境はVisual C++ 2010です。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

おっと, 確かに scanf で書式文字列と変数との対応が取れてませんね>#3... っていうか, そもそもこの書式文字列が不正なんだ.... 確かに # に違和感はあったんだけどそこまで確認してなかった. C99 なら %hhx でいいんだけど, VC2010 にはそれすらない.

その他の回答 (3)

回答No.3

というより >最初に入力した値がi < 20までループが続く としたら、それは偶然 入力文字列を出力していないし、文字変数に文字列を入れている。

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

scanfの書式指定子の使いこなしは、printfと違って難解です。初心者は使わないようにしましょう。 fgets() で入力して、sscanf() で値を取り出してください。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

どのように入力したのですか? そして, なぜ scanf の返り値を調べないのですか?

関連するQ&A

  • シーザー暗号(C言語)

    シーザー暗号というものを作ろうとしていますが、文字のずらし方がわからず詰まっています。 手順は一応考えてあります。 (1)入力された文字を配列input[301]に代入 (2)何文字ずらすかを指定してその数値を変数countに代入 (3)入力された文字の長さを変数lenに代入 (4)inputとcountとlenを、文字をずらしてそれをoutputに返す関数shiftに渡す (5)outputを表示する のような感じですが、肝心の文字のずらし方がわかりません。 JISコードを使ってやるといいと聞いたんですが、そのやり方がわかりません。 ソース↓ #include <stdio.h> #include <string.h> int shift_char(char x[], int y, int z) { int i; for(i = 0; i <= z; i++) { x[i] = x[i] + y; } return x; } int main(int argc, char* argv[]) { char input[301]; char output[301]; int count, len, i; printf("文字を入力してください: "); scanf("%s" ,input); printf("何文字ずらしますか: "); scanf("%d" ,count); len = strlen(input); output = shift_char(input, count, len); for(i = 0; i <= len; i++) { printf("%s" ,output[i]); } return 0; } よろしくお願いします。

  • C、C++

    SE未経験で勉強中です。 C、Visual studioC++、Windows 10 問題: sキーを入力してから10秒後に、 "10秒経ちました"と表示する。 for、Sleep、scanfを使用。 どのようにかいたらよいのか なんどやってもエラーは出ないものの 10秒経ったら文字が表示されることしかできず、 sキーを押してから10秒後、という処理ができません。 教えていただけたら幸いです。 #include 〈stdio.h〉 #include 〈windows.h〉 int main(void) { printf(“sキーを入力してください。”); Sleep(10000); printf(“10秒経ちました!” ); } ↑ここにどうやったらsキーを押してからこの処理を実行させるのですか?

  • C言語の質問です。

    C言語の質問です。 C言語で、PCの時間を、キーボードで入力した好きな秒数ごとに表示するプログラムを作りたいのですが、どうしても1秒ごとになってしまいます。ここまで作ったのですが、あとどのようにすればよろしいでしょうか? #include <stdio.h> #include <time.h> #include <string.h> int a2i(char x); main() { time_t jikoku; char t[30]; int h,m,s,so=0; int x,a; printf("秒数xを入力"); scanf("%d",&x); while(1){ for(a=0;a<x;a++){ time(&jikoku); strcpy(t,ctime(&jikoku)); h=a2i(t[11])*10+a2i(t[12]); m=a2i(t[14])*10+a2i(t[15]); s=a2i(t[17])*10+a2i(t[18]); if(s!=so+a){ printf("%d:%d:%d\n",h,m,s); so=s; } } } } int a2i(char x) { return(x-'0'); }

  • 文字列の照合についての質問(C言語)

    こんにちは<_ _> 文字列の照合に関する質問です。 データを探索するプログラムを作っていましたが 既存データと入力データの照合ができません。 #include<stdio.h> #include<string.h> #define N 10 int main(void) { static struct girl{ char *name; int age; }a[]={"Ann",18,"Rolla",19,"Nancy",16,"Eruza",17,"Juliet",18, "Machilda",20,"Emy",15,"Candy",16,"Ema",17,"Mari",18}; char key[20]; int i; printf("検索するdata ? : "); scanf("%s",key); for(i=0;i<N;i++){ ここの部分です if(a[i]==key){ break; } } printf("%s %d",a[i],a[i]); return 0; } 照合するにはどうしたらいいのでしょうか? (#include<stdio.h> から  int i;までは変えてはいけないと問題にあります。)

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

    #include<stdio.h> #define NAME 4 void main() { char str[NAME]; int i; for (i = 0;i < NAME;i++){ scanf("%s", &str[i]); } for(i = 0; i < NAME;i++){ printf("%s\n", str[i]); } } どこか間違っているのですか?それとも何か足りないのでしょうか? お願いします。

  • DirectX / C++の外部読み込みについて

    #include"DxLib.h" #define SIZE(27) #define size(300) #define PI_H(10) #define PI_W(10) int MyDrawPixel(int x, int y, int color){ int sx, sy, Wh=GetColor(255,255,255), Bl=GetColor(0,0,0); int col[]={Wh,Bk}; : : DrawBox(sx, sy, sx+SIZE-1, sy+SIZE-1, col[color],TURE);return0; } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE PrevInstance,LPSTR lpCmdLine,int nCmdShow){ int SetFontThickness(int TinckPal), CheckHitKey (int KeyCode),MouseX, MouseY; int i,j,PixelData[PI_H][PI_W]; FILE *fp; fp=fopen("p.txt","r"); if(fp==NULL){printfDx("FILE ERORR");exit(0);} for(i=0; i<PI_H; i++){ for(j=0; j<PI_W; j++){ scanf("%d", &PixelData[i][j]); } } fclose(fp); : : : } とファイルを読み込ませましたが、warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(237) : 'fopen' の宣言を確認してください。 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : 'scanf' の宣言を確認してください。 と表示されます。 原因を探していますが、解決方法はあるのでしょうか?

  • C言語

    下のようにするだけでなぜ、画面上に数字が表示されるのでしょうか? #include <stdio.h> #include <stdlib.h> #define KOSU 100 void main(void) { int ary[KOSU]; int key; int i; for (i = 0; i < KOSU; i++){ ary[i] = rand(); printf("%8d", ary[i]); } }

  • while文について、c言語です。

    ぼくはプログラム始めたばかりです。ミスを見つけられた方、ご指導お願いします。 正整数nを入力して、nの階乗をもとめるプログラムを作りたいのですが、実行結果がいつも1になります。どこがおかしいか教えてください。以下のプログラムです。 #include <stdio.h> int main(void) { int i, n, s; printf("n = ?"); scanf("%lf", &n); s = 1; i = 1; while(i <= n) { s = s * i; i = i + 1; } printf("s = %3d\n", s); return 0; }

  • c言語 for文

    /*指定された個数だけ整数を読み込んで合計値・平均値を算出*/ #include <stdio.h> int main(void) { int i; int sum=0; int num,tmp; printf("整数は何個ですか:"); scanf("%d",&num); for(i=0;i<num;i++) {printf("No.%d:",++i); scanf("%d",&tmp); sum = sum + tmp; } printf("合計値:%d\n",sum); printf("平均値:%.2f\n",(double)sum / num); return(0); } C言語の勉強を始めたばかりのものです。 指定された個数だけ読み込めません 汗 前置と後置をまぜたあたりがよくないのかなと思うのですが。。。 どうしておかしくなるのか教えてください。 内部でどういった処理が行われているのかまだあまりわからない状態です。 ちなみに4と入力した結果は以下です。 整数は何個ですか:4 No.1:4 No.3:3 合計値:7 平均値:1.75

  • C言語に直して下さい

    VisualC++で円周率を求めるプログラムなのだそうですが、 自分はC言語しか使ったことがないため、よく分かりません。 Cでコンパイルできるように直していただけないでしょうか。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 21 #define K 100000 void add(unsigned long a[],unsigned long b[]) { int c = 0, tmp; for (int i = N - 1; i > -1; i--) { tmp = a[i] + b[i] + c; a[i] = tmp % K; c = tmp / K; } } void sub(unsigned long a[],unsigned long b[]) { int c = 0, x = 0; for (int i = N - 1; i > -1 ; i--) { x = c; if (a[i] < b[i] + x ) c = 1; else c = 0; a[i] = c * K + a[i] - b[i] - x; } } void div(unsigned long a[], unsigned long x) { int c=0, tmp; if (x >= K) { printf("Div Error\n"); getchar(); exit(1); return; } for (int i = 0; i < N ; i++) { tmp = (a[i] + c * K) / x; c = (a[i] + c * K) % x; a[i] = tmp; } } void clear(unsigned long a[]) { memset(a,0x00,sizeof(a)*N); } void set(unsigned long a[], unsigned long b[]) { memcpy(a,b,sizeof(a)*N); } void set(unsigned long a[], unsigned long b) { if (b<K) { clear(a); a[0]=b; } } int _tmain(int argc, _TCHAR* argv[]) { unsigned long pai[N], fn[N], gn[N], tmp1[N], tmp2[N]; int i; unsigned long n; clear(pai); clear(fn); clear(gn); clear(tmp1); clear(tmp2); set(fn, 16*5); set(gn, 4*239); for(n=0;n<40000;n++) { div(fn, 25); div(gn, 239); div(gn, 239); set(tmp1, fn); div(tmp1, 2*n+1); set(tmp2, gn); div(tmp2, 2*n+1); if (n%2==0) { add(pai, tmp1); sub(pai, tmp2); }else{ add(pai, tmp2); sub(pai, tmp1); } } for (i=0;i<N;i++) { printf("%5lu ", pai[i]); } getchar(); return 0; }

専門家に質問してみよう