scanf中的换行符

时间:2013-11-20 11:46:00

标签: c newline scanf

我写了下面的程序,试图读取和打印结构的值。 我认为scanf忽略了除了char之外的所有kinf数据的/ n,但是当我运行下面的程序并将第一个输入作为整数提供时。我没有获得名称变量的o / p。为什么?

#include <stdio.h>
#include <string.h>
struct employee
{
    int empno;
    char name[10];
    float p_money;
};

int main()
{
    struct employee e;
    struct employee *ptr;
    ptr = &e;
    printf("please enter the empno \n");
    scanf("%d", &(ptr->empno));
    printf("please enter the name \n");
    gets(ptr->name);
    //scanf("%d", &(ptr->empno));
    printf("please enter the money \n");
    scanf("%f", &(ptr->p_money));
    printf("Roll No: %d\n", ptr->empno);
    printf("Name: %s\n", ptr->name);
    printf("Money: %f\n", ptr->p_money);
    getchar();
    return 0;
}

执行:

please enter the empno
10 
please enter the name
please enter the money
100.99

Roll No:10     名称:     钱:100.989998

please enter the empno
10jackal
please enter the name
please enter the money
100.99

Roll No:10     姓名:豺狼     钱:100.989998

2 个答案:

答案 0 :(得分:2)

问题不在于scanf,而在于gets - 而是使用fgets

  

char * gets(char * str);

     

gets - 从标准输入(stdin)读取字符并将它们作为C字符串存储到str中,直到到达换行符或文件结尾。

答案 1 :(得分:0)

1使用fgets代替gets ... gets不好。

gets不好的原因:

gets从标准输入中读取字符,直到按下enter(遇到新行)。

在您的情况下,name[10],您正在gets(name)gets不知道name有多大......如果输入9个字符,就可以了。 但如果输入超过9个字符怎么办? gets()继续将所有char写入不属于您的内存,从而导致“Undefined Behavior