2013-08-28 3 views
4

Мой код принимает только 5 значений в качестве входных данных.? Что я делаю не так?Почему мой цикл for не принимает 9 входов?

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    char arr[3][3]; 
    int i,j,n; 
    for(i=0;i<3;i++) 
    { 
     for(j=0;j<3;j++) 
     { 
      scanf("%c",&arr[i][j]); 
     } 
    } 
    return 0; 
} 

Как исправить ошибку?

+0

Образец ввода будет приятным, тоже. – zubergu

ответ

8

Изменить

scanf("%c",&arr[i][j]); 

в

scanf(" %c",&arr[i][j]);. 

Обратите внимание на пространство дано до спецификатор потреблять \n остается в буфере стандартного ввода при нажатии ввода.

Каждый \n работает как вход, занимающий ваше пространство от входного пространства.

+0

Это сработало. Но почему эта проблема не возникает в случае «% d».? – user2556926

+3

@ user2556926 Большинство спецификаторов формата, в том числе пропущенных пробелов% d, но% c - нет. – interjay

3

Он должен работать, но обратите внимание, что %c будет читать только один символ. Пробелы не подавляются, как и для других (более «высокоуровневых») спецификаторов формата, поэтому, если вы отделяете своих символов пробелами любого типа, они будут прочитаны вместо фактических символов.

Также обратите внимание, что вы должны проверить возвращаемое значение scanf(), оно может выйти из строя, если подходящий вход отсутствует.

-2

вы можете использовать fflush (STDIN)

char arr[3][3]; 
int i,j,n; 
for(i=0;i<3;i++) 
{ 
    for(j=0;j<3;j++) 
    { 
     scanf("%c",&arr[i][j]); 
     fflush(stdin); 
    } 
} 
+1

'fflush (stdin)' - неопределенное поведение. Он может работать на конкретной реализации, но не переносится. – interjay

+1

Это неопределенное поведение, поскольку fflush предназначен для вызова в выходном потоке. посмотрите [здесь] (http://stackoverflow.com/questions/2979209/using-fflushstdin). –

1

Первый вход хранится в обр [0] [0], то при нажатии клавиши ввода (возврата ключа) он хранится в обр [0] [1 ], и пока вы думаете, что вы вводите второй символ, вы фактически вводите третий вход. Попробуйте код ниже, чтобы узнать, не получили ли вы его.

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    char arr[3][3]; 
    int i,j,n; 
    for(i=0;i<3;i++) 
    { 
     for(j=0;j<3;j++) 
     { 
     printf("Input array [%d][%d]",i,j); 
      scanf("%c",&arr[i][j]); 
     } 
    } 
} 

И как для коррекции вам нужно scanf(" %c",&arr[i][j]); пространства, Infront из% с потреблять \n

Надеются, что это отвечает на ваш вопрос

0

Вместо этого вы можете использовать gets(arr[i][j])

вместо scanf("%c",&arr[i][j]);

Это будет работать отлично. Рекомендуется использовать функцию gets() and puts() вместо printf() и scanf() Функция для строки и символа в C

+0

Нет. Во-первых, 'get' нужен параметр типа' char * '. Во-вторых, 'get' является опасным, его всегда следует избегать и вместо этого использовать' fgets' или 'gets_s'. В-третьих, 'printf' для форматированного вывода,' puts' вряд ли заменяет во многих ситуациях. –

+0

o Фактически это 'getc' вместо' gets', и он всегда отлично работает для вышеупомянутой программы и связан с ней. –

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