Подтвердить что ты не робот

Как сделать scanf для одиночного char в C

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

Это код:

char ch;
printf("Enter one char");
scanf("%c", &ch);
printf("%c\n",ch);

Почему не работает?

4b9b3361

Ответ 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