Scanf читает неверное значение - PullRequest
0 голосов
/ 03 ноября 2019

Я новичок в языке программирования C, я написал простой код, который читает два «char» значения и печатает их на экране, но второе получило пустое значение по странной причине. Что не так с моим кодом?

Char c;
Scanf(“%c”,&c);
Printf(“Value:%c”,c);
Scanf(“%c”,&c);
Printf(“Value:%c”,c);

Вывод: Значение: г Значение:

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

(это комментарий, но его сложно отформатировать)

В вашем коде нет ничего плохого (кроме неспособности проверить значение, возвращаемое scanf, и устранить ошибки или неправильный ввод). Подумайте:

#include <stdio.h>
int
main(void)
{
        char c;
        scanf("%c",&c);
        printf("Value:%c",c);
        scanf("%c",&c);
        printf("Value:%c",c);
        return 0;
}
$ gcc a.c
$ printf 'abc' | ./a.out
Value:aValue:b

Возможно, что "неправильно" в том, что у вас есть новые строки в вашем вводе. (например, вы вводите данные в интерактивном режиме и забываете, что когда вы нажимаете «return», новая строка вставляется во входной поток.) ​​

1 голос
/ 03 ноября 2019

Если ваша цель состояла в том, чтобы прочитать двух «интересных» символов, и если вы не думаете, что пробельные символы, такие как пробел и символ новой строки, «интересны», вы попали на шестое место из семнадцати вещей о scanf предназначены для отключения неосторожных: %c делает чтение пробельных символов.

Если вы хотите, чтобы scanf пропускал пробельные символы, так что %c будет читатьследующий, непробельный или «интересный» символ, просто включите символ пробела в строку формата перед %c:

char c;
scanf(" %c", &c);
printf("Value: %c\n",c);
scanf(" %c", &c);
printf("Value: %c\n",c);

В строке формата scanf наличие символа пробелаозначает, что вы хотите, чтобы scanf пропустил все пробелы в этой точке на входе.

Обычно вам не нужно беспокоиться о пропуске пробела с scanf, потому что большинстводругие спецификаторы формата - %d, %f, %s и т. д. - автоматически пропускают любые пробелы, если это необходимо, прежде чем они начнут анализировать свои входные данные. Но %c особенный: кто-то подумал, что вы можете использовать его для чтения пробельных символов, поэтому он не пропускает их, поэтому, если вы не хотите их читать, вы должны пропустить их самостоятельно, с этим пробеломсначала в строке формата.

...