В C:
Я пытаюсь получить char от пользователя с помощью scanf
, и когда я запустил его, программа не дождалась, когда пользователь наберет что-нибудь...
Это код:
char ch;
printf("Enter one char");
scanf("%c", &ch);
printf("%c\n",ch);
Почему не работает?
Ответ 1
Спецификатор преобразования %c
не будет автоматически пропускать какие-либо ведущие пробелы, поэтому, если в входном потоке (например, из предыдущей записи, например, в случае предыдущей записи) будет использоваться нечеткая новая строка, вызов scanf
будет потреблять ее немедленно.
Один из способов решения проблемы состоит в том, чтобы поместить пробел перед спецификатором преобразования в строку формата:
scanf(" %c", &c);
Пустое значение в строке формата сообщает scanf
пропускать ведущие пробелы, а первый символ без пробелов будет считываться с помощью спецификатора преобразования %c
.
Ответ 2
Прежде всего, избегайте scanf()
. Использование этого не стоит боли.
Смотрите: Почему все говорят, что не использовать scanf? Что я должен использовать вместо этого?
Использование символа пробела в scanf()
будет игнорировать любое количество пробельных символов, оставшихся во входном потоке, что делать, если вам нужно прочитать больше входов? Рассмотрим:
#include <stdio.h>
int main(void)
{
char ch1, ch2;
scanf("%c", &ch1); /* Leaves the newline in the input */
scanf(" %c", &ch2); /* The leading whitespace ensures it the
previous newline is ignored */
printf("ch1: %c, ch2: %c\n", ch1, ch2);
/* All good so far */
char ch3;
scanf("%c", &ch3); /* Doesn't read input due to the same problem */
printf("ch3: %c\n", ch3);
return 0;
}
В то время как 3rd scanf() может быть исправлен таким же образом, используя ведущие пробелы, он не всегда будет таким простым, как указано выше.
Еще одна серьезная проблема: scanf()
не будет отбрасывать входной поток во входном потоке, если он не соответствует формату. Например, если вы введете abc
для int
, например: scanf("%d", &int_var);
, тогда abc
придется читать и отбрасывать. Рассмотрим:
#include <stdio.h>
int main(void)
{
int i;
while(1) {
if (scanf("%d", &i) != 1) { /* Input "abc" */
printf("Invalid input. Try again\n");
} else {
break;
}
}
printf("Int read: %d\n", i);
return 0;
}
Другой распространенной проблемой является смешение scanf()
и fgets()
. Рассмотрим:
#include <stdio.h>
int main(void)
{
int age;
char name[256];
printf("Input your age:");
scanf("%d", &age); /* Input 10 */
printf("Input your full name [firstname lastname]");
fgets(name, sizeof name, stdin); /* Doesn't read! */
return 0;
}
Вызов fgets()
не ждет ввода, потому что строка новой строки, оставленная предыдущим вызовом scanf(), считывается, а fgets() завершает ввод данных, когда встречает новую строку.
Есть много других подобных проблем, связанных с scanf()
. Вот почему, как правило, рекомендуется избегать этого.
Итак, какая альтернатива? Используйте fgets()
следующим образом, чтобы прочитать один символ:
#include <stdio.h>
int main(void)
{
char line[256];
char ch;
if (fgets(line, sizeof line, stdin) == NULL) {
printf("Input error.\n");
exit(1);
}
ch = line[0];
printf("Character read: %c\n", ch);
return 0;
}
Одна деталь, которую следует учитывать при использовании fgets()
, будет читать символ новой строки, если в буфере inut достаточно места. Если это нежелательно, вы можете удалить его:
char line[256];
if (fgets(line, sizeof line, stdin) == NULL) {
printf("Input error.\n");
exit(1);
}
line[strcpsn(line, "\n")] = 0; /* removes the trailing newline, if present */
Ответ 3
Прежде чем scanf поместит fflush(stdin);
, чтобы очистить буфер.
Ответ 4
Вот аналогичная вещь, которую я хотел бы поделиться,
пока вы работаете над Visual Studio, вы можете получить такую ошибку, как: "scanf": функция или переменная могут быть небезопасными. Вместо этого рассмотрите использование scanf_s. Чтобы отключить устаревание, используйте _CRT_SECURE_NO_WARNINGS
Чтобы предотвратить это, вы должны записать его в следующем формате
Один символ может быть прочитан следующим образом:
char c;
scanf_s("%c", &c, 1);
Когда считываются несколько символов для строк с нулевым завершающим символом, целые числа используются как спецификация ширины и размер буфера.
char c[4];
scanf_s("%4c", &c, _countof(c));
Привет,
Ответ 5
Предоставляет пробел перед спецификатором преобразования% c, чтобы компилятор игнорировал пробелы. Программа может быть записана следующим образом:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch;
printf("Enter one char");
scanf(" %c", &ch); /*Space is given before %c*/
printf("%c\n",ch);
return 0;
}
Ответ 6
попробуйте использовать getchar(); вместо
Синтаксис:
void main() {
char ch;
ch = getchar();
}
Ответ 7
Это работает для меня, попробуйте
int main(){
char c;
scanf(" %c",&c);
printf("%c",c);
return 0;
}
Ответ 8
Используйте строку вместо char
как
char c[10];
scanf ("%s", c);
Я считаю, что он работает хорошо.
Ответ 9
Мне это подходит:
#include <stdio.h>
int main (void)
{
char a;
scanf ("%c", &a);
printf ("%c\n", a);
return 0;
}
Не знаю, почему ваш код не работает. Я использую Codelite с gcc