Первая проблема заключается в том, что scanf()
читает два символа, но не перевод строки после этого.
Это означает, что ваш fgets()
читает символ новой строки и завершает.
Вам повезло, что ваша программа не падает. Вы говорите fgets()
, что он получает массив из 35 символов, но вместо передачи массива вы передаете символ (даже не адрес символа). Это также говорит о том, что вы не , включая #include <stdio.h>
(вы не можете использовать scanf()
надежно в соответствии со стандартом C без прототипа для scanf()
в области действия), и вы не компилируете с достаточным количеством предупреждения включены или не уделяют достаточного внимания тому, что говорит ваш компилятор.
Вы должны получать предупреждения компилятора. Например, GCC 4.6.0 говорит:
/usr/bin/gcc -g -I/Users/jleffler/inc -std=c99 -Wall -Wextra -Wmissing-prototypes \
-Wstrict-prototypes -Wold-style-definition xxx.c
xxx.c: In function ‘main’:
xxx.c:7: warning: implicit declaration of function ‘prinf’
xxx.c:8: warning: passing argument 1 of ‘fgets’ makes pointer from integer without a cast
И, черт возьми, я даже не заметил орфографической ошибки prinf()
для printf()
, пока не попытался связать, и компилятор потер мне нос, сказав: «Не знаю, что такое prinf()
! ».
Если ваш компилятор по крайней мере не выдает второе предупреждение, найдите себе лучший компилятор.
Комментарий:
Как мне остановить чтение новой строки после нее?
Проблема не мешает scanf()
читать новую строку; проблема на самом деле в том, как заставить его прочитать его так, чтобы fgets()
получил четкий запуск на следующей строке ввода. Это на самом деле скромно сложно - одна из причин, почему я редко использую scanf()
(но я часто использую sscanf()
). Это делает работу для простых вводов:
#include <stdio.h>
int main(void)
{
char a,b,cstring[35];
printf("please enter something");
scanf("%c %c%*c", &a, &b);
printf("thanks, now some more");
fgets(cstring, 35, stdin);
printf("OK: I got %c and %c and <<%s>>\n", a, b, cstring);
return 0;
}
%*c
читает дополнительный символ (новую строку), не назначая его где-либо (это из-за *
). Однако, если после второго непустого есть несколько символов, это не поможет. Вероятно, я бы написал цикл для чтения новой строки:
#include <stdio.h>
int main(void)
{
char a,b,cstring[35];
int c;
printf("please enter something");
scanf("%c %c", &a, &b);
while ((c = getchar()) != EOF && c != '\n')
;
printf("thanks, now some more");
fgets(cstring, 35, stdin);
printf("OK: I got %c and %c and <<%s>>\n", a, b, cstring);
return 0;
}
Обратите внимание, что getchar()
возвращает int
, а не char
. Это надежно отбрасывает все на первой строке ввода. Здесь также показано, как повторить прочитанное - важная часть отладки.