2015-06-03 2 views
1

Я делаю программу принимать ввод в состав учителей, но есть ошибка времени неизвестный пробег, вот код -Ошибка при получении ввода в структуре с использованием получает()

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

struct Teacher 
{ 
char Name[30]; 
char Qualifications[20]; 
int experience_year; 
}th[10]; 

void teacher() 
{  
int t,i; 
printf("Enter how many teachers are in department\n"); 
scanf("%d",&t); 
for(i=1;i<=t;i++) 
{  
    printf("Enter name of teacher : "); 
    gets(th[i].Name); 
    printf("Enter qualification of teacher : "); 
    gets(th[i].Qualifications); 
    printf("Enter experience_year of teacher : "); 
    scanf("%d",&th[i].experience_year); 
} 
for(i=1;i<=t;i++) 
{ 
    printf("Details of %d teacher\n",i); 
    printf(th[i].Name); 
    printf(" "); 
    printf(th[i].Qualifications); 
    printf(" "); 
    printf("%d",th[i].experience_year); 
    printf("\n"); 
} 
} 
int main() 
{ 
    teacher(); 
    return 0; 
} 

Выход -

Enter number of teacher 
1 
Enter teachers name : Enter qualification of teacher : 

Как получить имя учителя (ввод) .. и какова ошибка?

+4

Основная ошибка здесь в том, что вы используете 'gets'. Вместо этого используйте 'fgets'. – szczurcio

+2

@szczurcio не упоминает даже о том, что вы используете 'conio.h';) – Levi

+0

@szczurcio, но это не решит проблему. –

ответ

2

Используйте это:

getchar(); 

перед тем

gets(th[i].Name); 

потреблять ведущие пробельные и новую строку, которые остались в буфере из-за предыдущие заявления.

Кроме того, я бы рекомендовал fgets, который безопаснее, чем gets как:

fgets(th[i].Name,30,stdin); 

и

fgets(th[i].Qualifications,20,stdin); 

Why gets is dangerous

+0

Большое спасибо :) ты лучший! – udit043

+1

Hardcoding размер буфера в 'fgets' is bad IMO,' sizeof (th [i] .Name) 'лучше. – szczurcio

+0

@szczurcio: Да, вы правы, я просто привел простой пример, хотя я согласен с вами. –

1

При вводе числа учителей, что т вы вводите a \ n после целого числа, которое остается в вашем буфере и принимается в качестве входных данных в инструкции gets. Поэтому используйте getchar после ввода целого числа для решения проблемы.

int t,i; 
printf("Enter how many teachers are in department\n"); 
scanf("%d",&t); 
getchar(); 

и добавить еще один getchar после scanf в цикле for.

scanf("%d",&th[i].experience_year); 
getchar(); 
3

Сначала напоминают для хороших и плохих обычаев:

  • ты не должен использовать gets - только fgets хорошо
  • ты не должен смешивать [f]gets и [f]scanf - только придерживаться одного режима ввода

Теперь давайте будем серьезными.

gets пытается ввести в ваш входной массив столько символов, сколько присутствует во входном потоке: это было причиной бесчисленного нарушения памяти. Никогда не используйте его и использовать только fgets в вы хотите иметь дело с вводом режима линии (но не забывайте о том, что вход fgets держит завершающий \n)

[f]scanf используются для пустых разграниченных полей. То есть он считывает поле до следующего пустого символа (по крайней мере, пробел, табуляция, \r или \n) и оставляет его во входном потоке. Вы можете попытаться пропустить это с помощью fgets и отбросить прочитанное или прочитать символ по символу до \n. Избегайте этого, потому что вы получили номер bad ответил (-а) советуем использовать getchar().Это всегда первая попытка, и она работает, пока вы не получите вход с (невидимыми) пробелами перед новой строкой - просто попробуйте, и вы поймете, почему это неправильное решение.

Так что вы должны делать? Если входной линии ориентированной, только использовать fgets, а затем декодировать входные значения с sscanf:

void teacher() 
{  
int t,i; 
char line[16]; 
printf("Enter how many teachers are in department\n"); 
fgets(line, sizeof(line), stdin); 
sscanf(line, "%d",&t); 
for(i=1;i<=t;i++) 
{  
    printf("Enter name of teacher : "); 
    fgets(th[i].Name, 30, stdin); 
    printf("Enter qualification of teacher : "); 
    fgets(th[i].Qualifications, 30, stdin); 
    printf("Enter experience_year of teacher : "); 
    fgets(line, sizeof(line), stdin); 
    sscanf(line, "%d",&th[i].experience_year); 
} 
... 

И в самом деле хорошей практики (на самом деле все, что можно было бы использовать в реальной workd) вы должны всегда тест результат ввода функций (в качестве упражнения для читателя кода выше :-))

1

Использование:

#include <stdio.h> 
#include <conio.h> 
void main() { 
    char name[3][100], add[3][100]; 
    int i; 
    printf("ENTER YOUR DETAIl:"); 
    for (i = 0; i < 3; i++) { 
     fflush(stdin); 
     printf("ENTER NAME: "); 
     gets(name[i]); 
     printf("ENTER ADDRESS: "); 
     gets(add[i]); 
    } 
    for (i = 0; i < 3; i++) { 
     printf("\n___________________\n"); 
     printf("\nNAME:%s", name[i]); 
     printf("\Address:%s", add[i]); 
     printf("\n___________________\n"); 
    } 
    getch(); 
} 

Вы можете использовать этот способ в программирования C. Если ваша программа не принимает строку с пробелами в качестве ввода для нескольких типов ввода строк.

fflush(stdin); 

Эта функция очистит ваш буфер ввода.

+1

это может быть использовано в случае структуры тоже –

+0

Спасибо:) ........ – udit043

Смежные вопросы