2014-10-17 16 views
0

Это в моей главной функции ..Почему мой второй «scanf» пропущен?

printf("How many marking components in the course? "); 
    scanf("%d", &numberOfComponents); 
    for (int i=0; i<numberOfComponents; i++){ 

      char c[MAX_STR]; 
      printf("enter next component name: "); 
      fgets(c, sizeof(c), stdin); 
      scanf(c, " %c", &c); 


      Component comp; 

      initComp(&comp, c); 
      class.comps[i] = comp; 

      } 

    printf("How many marking schemes? "); 
    scanf(" %d", &numberOfSchemes); 

Я попробовал белое пространство, но он по-прежнему сохраняется

+5

Что означает 'scanf (c,"% c ", &c);' Предполагаемое значение? Что вы пытались сделать этим вызовом 'scanf'? – AnT

ответ

0

Смешивание fgets() с scanf() часто вызывают проблемы.

scanf("%d"... оставляет любые следующие пробелы, такие как '\n' в stdin для fgets(), чтобы получить. То же самое происходит после scanf(c, " %c", &c); (вероятно, это должно было быть scanf(" %c", c); или sscanf(c, " %c", c);).

scanf("%d", &numberOfComponents); 
... 
fgets(c, sizeof(c), stdin); 

Рекомендуется использовать только fgets(), чтобы получить пользовательский ввод и использование sscanf(), strtol() и т.д., чтобы разобрать этот вход.

fgets(c, sizeof(c), stdin); 
sscanf(c, "%d", &numberOfComponents); 

.... 

fgets(c, sizeof(c), stdin); 
// I do not think you need the following line of code. 
// Besides it is UB as it attempts to scan and save into the same buffer. 
// sscanf(c, "%c", &c); 

Проверка ошибок результата fgets(), sscanf() опущена, но все же хорошо делать.

+0

по« следующей строке кода », вы имеете в виду f получает? или scanf? – Bauer

+0

@Nolan Hodge 'sscanf (c,"% c ", &c);' – chux

1

Вы должны проверить, что ваши операции ввода работали; вещи идут, когда вы этого не делаете.

Этот призыв к scanf():

scanf(c, " %c", c); 

должен (как chux диагнозов в его answer) быть написаны по-разному, но я думаю, что это должно быть больше как:

char filler; 
if (scanf(" %c", &filler) != 1) 
    …report problem… 

Оригинальная версия использует которая была просто прочитана как строка форматирования, и почти наверняка не удалось совместить второй вход. Если вы просто используете scanf(" %c", c), что является самым простым редактированием, вы перезаписываете первый символ строки ввода следующим непустым символом.

Тогда возникает вопрос, почему вы заставляете пользователя вводить дополнительные данные после имени компонента. Они должны что-то ввести. В следующем fgets() код будет считываться после первого символа до следующей новой строки. Итак, если вы набрали:

component-1 
component-2 

Первый fgets() прочтет component-1 и символ новой строки; scanf() с внесенными в него поправками будет читать c от component-2 до c[0], а затем следующий fgets() будет читать omponent-2 плюс новую строку в c на следующей итерации.

Вы могли видеть больше того, что происходит путем добавления кода для печати, что вы читаете, как вы читаете это:

printf("Line 1: [[%s]]\n", c); // after the fgets() 
printf("Line 2: [[%s]]\n", c); // after the scanf() 

Это один из самых основных методов отладки; эхо прочитайте, чтобы убедиться, что программа получила данные, которые, по вашему мнению, они получили.

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