struct Empregado v_empregados[10];
main() {
int i;
for(i=0; i<10; i++){
printf (“Nome e apelidos? “);
gets (v_empregados[i].nome);
printf (“Idade? “);
scanf(“%d”,&v_empregados[i].idade);
getchar();
printf(“Domicilio? “);
gets (v_empregados[i].domicilio);
printf (“Salario? “);
scanf(“%f”,&v_empregados[i].salario);
getchar();
}
在这段代码中,使用getchar()的目的是什么?
答案 0 :(得分:2)
这是破解的代码。
程序员使用getchar()
清除前一个*scanf()
之后输入缓冲区中的未读新行。这是一种常见的模式。
请注意,如果下一个输入为*scanf( "%d" )
或*scanf( "%f" )
或实际上任何*scanf()
,则以%c
,%[
和{{1}以外的转换开头无论如何都会跳过前导空格,这会使%n
多余。
但更重要的是:
永远不要使用getchar()
。 无法此功能可以防止缓冲区溢出,而且 >出于这个原因,从语言标准的较新版本中删除了。 改为使用fgets()
。
其次:
如果您使用gets()
阅读用户输入(1),至少检查返回值。如果用户输入的内容与期望值不符,则输入匹配将失败,请保留参数(例如*scanf()
)未初始化。
(1)v_empregados[i].nome
在读回您自己的应用程序先前编写的格式化数据时非常好。但是,如果输入可能不处于预期格式(例如,当要求用户输入时),则从该条件优雅地恢复的能力是有限的。这里的一般建议是使用*scanf()
读取整行输入,然后使用例如解析内存中的内容。 strtol()
或strtod()
,在许多方面都很优越。您也可以随时返回并尝试不同的解析。
答案 1 :(得分:0)
添加getchar()
是为了丢弃之前\n
遗留下来的scanf()
(换行符)(请记住在输入数字后按 Enter 对于scanf
?)。
如果没有getchar()
,\n
将保留在stdin
中,一旦执行到达gets
,它就会在stdin
中看到换行符消耗它,因此,不等待进一步的输入。
答案 2 :(得分:-1)
完成上一个\n
执行后,使用左侧的换行符scanf()
。
也可以通过向下一个scanf()
添加空格来解决此问题,就像您的代码一样..
scanf(“ %d”,&v_empregados[i].idade);
注意强>
不要使用
gets()
,已弃用。
但是,您的大部分代码都在main()
函数之外,因此无法编译。