2015-03-28 3 views
1

Я хотел создать программу, которая может читать правильные ответы, проверять ответы учащихся по сравнению с правильными ответами, а затем показывать точки каждого. Проблема в том, что каждый раз, когда я вставляю первый ответ, программа пропускает второй и переходит к третьему. Вот как получается каждый раз:C-язык, что не так с этим?

"Вставить ответ 1:

Вставить ответ 2: Вставьте ответ 3:"

И вот мой код:

#include <stdio.h> 

int main() 
{ 
    char v[30], a[30][20]; 
    int i,j,c; 

    for (i=0; i<30; i++) 
    { 
     printf("Insert the answer %d: ", i+1); 
     scanf("%c", &v[i]); 
    } 

    for(j=0; j<20; j++) 
    { 
     printf("Student %d\n", j+1); 

     for (i=0; i<30; i++) 
     { 
      printf("Insert your answer %d: ", i+1); 
      scanf("%c", &a[i][j]); 
     } 
    } 

    for(j=0; j<20; j++) 
    { 
     c=0; 
     printf("Student %d\n", j+1); 

     for (i=0; i<30; i++) 
     { 
      if (v[i] == a[i][j]) 
       c=c+1; 
     } 

     printf("Points: %d\n", c); 
    } 

    return 0; 
} 
+0

проблема, скорее всего, в scanf возвращается дважды. замените на readln. –

ответ

1

scanf("%c", &var); читает ровно один символ от stdin. Итак, первый scanf читает символ, а второй scanf читает новую строку \n. Чтобы решить эту проблему, используйте

scanf(" %c", &var); 
     ^----- note the space 

Ввод пробел перед %c говорит scanf пропустить пробелы (включая символы новой строки) перед чтением символа.

2

Проблема в том, что scanf() оставляет в буфере \n, поэтому второй вызов читает это, а затем третий вызов получает буфер пустым и ждет ввода.

Вы можете очистить буфер самостоятельно с этим

void cleanBuffer(){ 
    while(getchar() != '\n'); 
} 

или прекратить использование scanf() и использовать fgets() вместо этого и получить данные с помощью sscanf(), есть несколько причин, почему вы хотите хотите сделать последний.

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