3

我是 C 新手,正在做一些练习,但在 while 循环中遇到了 get() 问题。在搜索中,我相信它可能与 \n 字符有关,但我希望有人能够更彻底地解释这里发生的事情:

这个循环只会运行一次——它会再次打印“输入姓氏”到屏幕上,然后在 gets() 有机会第二次接受任何输入之前退出循环:

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;
}

提前致谢!

4

2 回答 2

5

\n读取薪水后,您将在输入缓冲区中有一个换行符 ( )。在第二次迭代中,它被选为姓氏。getchar()您可以通过在最后一次 scanf 之后添加 a 来忽略它:

while (employee_num <= 10) {
    ...
    printf("Enter salary ");
    scanf("%d", &employee[employee_num].salary);        
    ++employee_num;
    getchar();
}
于 2013-01-22T18:48:50.870 回答
2

参考skjaidev的回答,

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

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

在程序中使用被认为是一种不好的做法gets()

于 2013-01-22T18:51:24.467 回答