gets()只在while循环中输入一次

时间:2013-01-22 18:42:32

标签: c gets

我是C的新手,正在进行一些练习,但在while循环中遇到了gets()问题。在搜索中,我相信它可能与\ n字符有关,但是我希望有人能够给我一个更详尽的解释:

这个循环只会运行一次 - 它将打印'输入姓氏'再次屏幕,然后在get()有机会再次输入任何输入之前退出循环:

while (employee_num <= 10)
{
    printf("Enter last name ");
    gets(employee[employee_num].last_name);
    if(strlen(employee[employee_num].last_name) == 0)
        break;
    printf("Enter first name ");
    gets(employee[employee_num].first_name);
    printf("Enter title ");
    gets(employee[employee_num].title);
    printf("Enter salary ");
    scanf("%d", &employee[employee_num].salary);        
    ++employee_num;
}

提前致谢!

2 个答案:

答案 0 :(得分:4)

在阅读薪水后,您在输入缓冲区中有换行符(\n)。这被作为第二次迭代中的姓氏。你可以在最后一次scanf之后添加getchar()来忽略它:

while (employee_num <= 10) {
    ...
    printf("Enter salary ");
    scanf("%d", &employee[employee_num].salary);        
    ++employee_num;
    getchar();
}

答案 1 :(得分:2)

参考skjaidev的回答,

使用gets(),如果找到换行符字符(\n),则不会将其复制到字符串中,这就是您遇到问题的原因。

另外, 请注意,gets与fgets完全不同:不仅使用stdin作为源,而且在结果字符串中不包含结尾newline字符,并且不允许指定最大值str的大小(可能导致缓冲区溢出)。

在程序中使用gets()被认为是糟糕做法