这个c代码中使用的getchar()是什么?

时间:2015-10-21 09:17:12

标签: c getchar

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()的目的是什么?

3 个答案:

答案 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()函数之外,因此无法编译。