c读取字符串输入错误

时间:2013-01-28 23:52:45

标签: c arrays string pointers

struct employee {
        int employeeId;
        double payrate;
        char *inputname;
    };



    int main (void){

        //remember the struct before employee

        struct employee davidB;
        fgets(davidB.inputname, 20, stdin);
        davidB.employeeId = 1;
        davidB.payrate = 45020.50;


        printf("The employees name is %s\n The employees id num is  %d\n The employees payrate is %f\n", davidB.inputname, davidB.employeeId, davidB.payrate);

        struct employee ericG;

        printf("Please enter employee name, id number, and payrate\n");

        scanf("%s", ericG.inputname);
        scanf("%d", &ericG.employeeId);
        scanf("%lf", &ericG.payrate);

        printf("The employees name is %s\n The employees id num is  %d\n The employees payrate is %f\n", ericG.inputname, ericG.employeeId, ericG.payrate);

        return 0;
    }

我的问题涉及:

                          fgets(davidB.inputname, 20, stdin);  
                          scanf("%s", ericG.inputname);

为什么第一个工作以及为什么第二个会导致堆栈溢出?此外,什么时候可以直接为指针指定“字符串”,何时需要预先定义的字符数组?

例如:

   const char *string = "Hey"; //works? so can't I do the same with the scanf above?

3 个答案:

答案 0 :(得分:1)

你需要分配内存才能使用这些函数,否则你会得到堆栈溢出,因为这个指针(davidB.inputname)指向垃圾。

一个选项是将其定义为char inputname[21];,但这只适用于fgets函数,因为您可以限制读取的字符数。 但是对于scanf,你无能为力,除非你可以100%读取你将要阅读的字符串的大小,所以最好不要这样做。

答案 1 :(得分:1)

您尚未为`inputname分配内存。所以两者都调用未定义的行为。所以两者都不起作用,不管怎样都不合法。

但是当你直接分配时:

const char *string = "Hey";

string仅指向字符串文字。所以那里不需要内存分配。

因此,您可以直接分配给struct成员:

    struct employee davidB;
    davidB.inputname = "Eric"; // Thiis is valid.
    davidB.employeeId = 1;
    davidB.payrate = 45020.50;

否则,您必须为inputname动态分配内存:

    struct employee davidB;
    davidB.inputname = malloc(256);
    fgets(davidB.inputname, 256, stdin); 
    davidB.employeeId = 1;
    davidB.payrate = 45020.50;

答案 2 :(得分:1)

只是随机运气,单向运行,但另一种运行没有。两种方法都不正确,因为您没有为inputname分配任何内存以指向。因此,这些功能只是将数据输入到某个随机存储器位置。

const char * string =“Hey”有效,因为这是静态数据,编译器正在为它分配空间。