Member 13320514 Ответов: 1

Почему мой строковый ввод не принимается


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


struct est
{
int sno;
};

void main()
{
struct est s1;
char name[40];

printf("enter a number\n");
scanf("%d", &s1.sno);

printf("Name?\n");
fgets(name, 40, stdin);
getch();
}


Я полный нуб в Си, и мне действительно нужна помощь.
Первый ввод идет нормально, но после того, как он печатает Имя? как только я нажимаю любую клавишу, он либо выходит (в Orange C IDE), либо показывает эквивалентный ASCII (Pelles C, хотя я уверен, что на самом деле он просто выходит)
Он прекрасно работает и без того, чтобы я использовал первый scanf, не знаю почему.
Любая помощь очень ценится: ^)

Что я уже пробовал:

Я тоже пробовал gets (), но напрасно.

1 Ответов

Рейтинг:
0

Jochen Arndt

Это потому что ваш scanf() вызов считывает входные данные без нового символа строки, генерируемого при нажатии клавиши ENTER. Таким образом, этот новый символ строки все еще находится во входном буфере. То fgets() вызов будет считываться с входных данных до тех пор, пока не появится новый символ строки. Но это уже есть, и поэтому оно немедленно возвращается.

Об этом уже спрашивали раньше, и множество ответов и решений можно найти в интернете, например, по адресу инструкции c-fgets пропускаются.Почему? - Переполнение Стека[^].

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