2016-08-11 2 views
0

文字Xを押すたびにループが終了しない理由を誰に教えてもらえますか?どのようにプログラムをバックスペースの値を取得し、配列に入力しないようにするには?Cプログラミング:forループとブレーク

#include <stdio.h> 
#include <stdlib.h> 
#include<math.h> 
#define N 2 
#define M 4 


int main() 
{ 
int i,j,a[N][M]; 

for(i=0;i<N;i++) 
{ 
    for(j=0;j<M;j++) 
    { 
     scanf("%c",&a[i][j]); 
     if(a[i][j]=='X') 
      break; 
    } 
     if(a[i][j]=='X') 
      break; 
} 
    return 0; 
} 
+1

あなたは、端末上で標準入力を介して入力を渡している場合は、だけにして標準入力バッファが渡されます、「X」を押した後にEnterキーを押す必要がありますあなたのプログラムに。 – Nishant

+0

タイトルを変更してください!あなたの問題はscanfに関するもので、ループコマンドに間違いはありません。 – ralfg

+0

[Cでの入力の読み込み/解析方法は? FAQ](http://stackoverflow.com/questions/35178520/how-to-read-parse-input-in-c-the-faq) – Lundin

答えて

1

あなたのコード内の2つの問題があります。

  • すでに リシケシラージによって指摘されている最初の1:あなたは、スキャンを食べるために、scanf関数()コマンドにスペースを追加する必要があります"\ n"文字。

  • 次に、文字(%c)をスキャンし、それらをint配列に格納しようとします。代わりに

    char a[N][M]; 
    

    を使用してください。私のgccはあなたの間違ったコードで警告を出します。他のコンパイラはこれを黙って無視するかもしれません。

    でも、リトルエンディアン環境(PCのような)では、int変数のアドレスに格納されたcharは同じ値になるはずです。ただし、char値は1バイトしか占めず、残りのバイト(3以上)は初期化されません。前にゼロバイトがある場合、a[i][j]は 'X'になります。それ以外の場合は、乱数になります。

    これは動作を説明していると思います。このプログラムはいくつかの 'X'ではランダムに停止しましたが、必ずしもそうではありません。

2

変更scanf("%c",&a[i][j]);

scanf(" %c",&a[i][j]);これは、文字をスキャンする前にバイパスすべきスペースが可能になります。

+0

なぜこれが起こるのですか? –

+1

@DaveNguyen前の 'scanf'のため' '\ n ''が' stdin'に残るので必要です。ですから、次回は 'scanf'が' \ n''を読み込んで返します。したがって、 ''%c ''の前にスペースを入れる必要があります。 – ameyCU

+1

これは、入力バッファ(STDIN)がどのように動作するかを示します。押された文字はバッファに入ります。一般に、%cは文字の前のスペースを無視しますが、Enterキーを押すと、それが入力となり、 '\ n' –

0

変更通常のgccはこのためにあまりにも警告を表示します

int i,j; 
char a[N][M]; 

int i,j,a[N][M]; 

変更をcharへのint型から配列aのタイプ:

so.c: In function ‘main’: 
so.c:16:9: warning: format ‘%c’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=] 
     scanf("%c",&a[i][j]); 
0

メイクそれはint配列ではなくchar配列です

char a[N][M];

の代わりに、

int a[N][M];