2016-08-11 1 views
0

Может ли кто-нибудь сказать мне, почему цикл не выходит, когда я нажимаю букву X? Как заставить программу не получить значение backspace и войти в массив?C Программирование: для цикла и перерыва

#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», только тогда буфер STDIN будет принят к вашей программе. – Nishant

+0

, пожалуйста, измените название! ваша проблема в scanf, ничего неправильного в командах цикла. – ralfg

+0

[Как читать/анализировать ввод в C? FAQ] (http://stackoverflow.com/questions/35178520/how-to-read-parse-input-in-c-the-faq) – Lundin

ответ

1

Есть две проблемы в вашем коде:

  • Первый из них уже указывал Ришикеш Raje: Вам нужно добавить пробел к команде зсапЕ() для того, чтобы съесть до отсканированное Символы "\ n".

  • Затем вы сканируете символы (% c) и пытаетесь сохранить их в массиве int. Использовать

    char a[N][M]; 
    

    вместо этого. Мой gcc дает предупреждение на ваш ошибочный код. Другие компиляторы могут молча игнорировать это.

    По-прежнему, в среде с маленькими концами (как и на ПК) можно подумать: символ, хранящийся по адресу int-variable, должен привести к тому же значению. Однако значение char занимает только один байт, остальные байты (3 или более) сохраняются неинициализированными. Если раньше были нулевые байты, то a[i][j] будет «X», в противном случае это будет какое-то случайное число.

    Это объясняет поведение, я думаю, вы заметили: программа случайно остановилась на каком-то «Х», но не всегда.

2

Изменения scanf("%c",&a[i][j]); в scanf(" %c",&a[i][j]);

Это позволяет для любых пространств быть обойдено перед сканированием символа.

+0

Почему это происходит? –

+1

@DaveNguyen Это необходимо, поскольку '' \ n'' остается в 'stdin' из-за предыдущего' scanf'. Итак, в следующий раз 'scanf' читает' '\ n'' и возвращается. Поэтому вам нужно поставить пробел до '% c''. – ameyCU

+1

Так работает входной буфер (STDIN). Любой символ, который нажат, переходит в буфер.Как правило,% c будет игнорировать пробелы перед символом, но если вы нажмете enter, тогда он примет это как вход и сохранит '\ n' –

0

Изменить тип массива а от междунар обугливаться

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

изменение

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

Обычно НКУ предупредит вас тоже за это:

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 a[N][M];

Вместо,

int a[N][M];

Смежные вопросы