Почему scanf () не принимает входные данные от пользователя при работе со строками? - PullRequest
1 голос
/ 17 ноября 2011

Мой код выглядит следующим образом

typedef struct
{
 char name[15];
 char country[10];
}place_t;  

int main()
 {
 int d;
 char c;
 place_t place;
 printf("\nEnter the place name : ");
 scanf("%s",place.name);
 printf("\nEnter the coutry name : ");
 scanf("%s",place.country);
 printf("\nEnter the type of the place : Metropolitan/Tourist (M/T)?");
 scanf("%c",&c);
 printf("You entered %c",c);
 return 0;
 }

Если я запускаю программу, она запрашивает название места и название страны, но никогда не ждет ввода символов от пользователя.
Я пытался

fflush(stdin);
fflush(stdout);

Ни одна работа.

Примечание: вместо символа, если я пишу аналогичный код для получения целого числа или числа с плавающей запятой, он запрашивает значения, и код работает просто отлично.

int d;
printf("\nEnter the type of the place : Metropolitan/Tourist (M/T)?");
scanf("%d",&d);

Почему это происходит? Что-то не так в коде?

Ответы [ 4 ]

3 голосов
/ 17 ноября 2011

Проблема в том, что scanf оставляет пропуски после введенных непробельных символов в буфере потока, которые затем читает scanf(%c...). Но подождите секунду ...

В дополнение к тому, что сложно получить право, такой код, использующий scanf, ужасно небезопасен. Вам гораздо лучше использовать fgets и анализировать строку позже:

char buf[256];
fgets(buf, sizeof buf, stdin);
// .. now parse buf

fgets всегда получает полную строку из ввода, включая символ новой строки (при условии, что буфер достаточно большой), и вы, таким образом, избегаете проблемы, с которой вы сталкиваетесь с scanf.

1 голос
/ 17 ноября 2011
 printf("\nEnter the place name : ");
 scanf("%s%*c",place.name);
 printf("\nEnter the coutry name : ");
 scanf("%s%*c",place.country);
 printf("\nEnter the type of the place : Metropolitan/Tourist (M/T)?");
 scanf("%c",&c);
 printf("You entered %c",c);
1 голос
/ 17 ноября 2011

Вы можете использовать строку вместо символа для scanf.

0 голосов
/ 15 января 2019

Попробуйте добавить пробелы перед знаком % в scanf ().
Я предоставил измененный код ниже.

#include <stdio.h>
#include <string.h>

typedef struct
{
    char name[15];
    char country[10];
} place_t;

int main()
{
    int d;
    char c;
    place_t place;
    printf("\nEnter the place name : ");
    scanf(" %s",place.name);
    printf("\nEnter the coutry name : ");
    scanf(" %s",place.country);
    printf("\nEnter the type of the place : Metropolitan/Tourist (M/T)?");
    scanf(" %c",&c);
    printf("You entered %c",c);
    return 0;
} 
...