使用gets()

时间:2015-06-03 11:41:36

标签: c arrays structure gets

我正在制作一个程序来接受教师结构的输入但是有未知的运行时错误,这里是代码 -

#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 :

如何获得教师姓名(输入)..以及错误是什么?

5 个答案:

答案 0 :(得分:3)

首先提醒好的和坏的实践:

  • 你不能使用gets - 只有fgets是好的
  • 你不要混用[f]gets[f]scanf - 只坚持一种输入模式

现在让我们认真对待。

gets尝试在输入数组中输入与输入流中存在的字符数一样多的字符:它曾经是无数内存违规的原因。 从不使用并仅在您想要处理线路模式输入时使用fgets(但不要忘记fgets的输入会保留终止\n

[f]scanf用于空白分隔字段。也就是说它会读取一个字段,直到下一个空白字符(至少是空格,制表符,\r\n)和将其留在输入流中。你可以尝试使用fgets跳过它并丢弃所读取的内容,或者逐个字符地读取\n。避免它,因为你有很多答案建议使用单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);
 }
 ...

在非常好的实践中(事实上所有可以在实际工作中使用的)你应该总是测试输入函数的结果(在上面的代码中留给读者练习:-) )

答案 1 :(得分:2)

使用此:

getchar();

之前

 gets(th[i].Name);

使用前导空格和换行符,这些空格和换行符由于之前的语句而留在缓冲区中。

此外,我建议使用fgets,它比gets更安全:

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

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

Why gets is dangerous

答案 2 :(得分:1)

输入教师人数时,在整数之后输入\ n,该整数保留在缓冲区中并在gets语句中被接受为输入。因此在输入整数后使用getchar来解决问题。

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

并在for循环中的scanf之后添加另一个getchar。

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

答案 3 :(得分: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);

此功能将清除输入缓冲区。

答案 4 :(得分:0)

使用

fflush(stdin);

gets()