C:使用fgets读取用户输入时出现分段错误

时间:2015-07-09 15:49:43

标签: c input fgets

我是C的新手,而我正在尝试编写一个包含大量用户输入的程序。为此,我写了这个函数:

Collector<Map<String, Object>, ?, Map<String, Object>> collector = 
        MoreCollectors.pairing(
                Collectors.summingDouble(m -> (Double)m.get("price")), 
                Collectors.summingInt(m -> (Integer)m.get("id")), 
        (sumPrice, sumId) -> EntryStream.<String, Object>of
                ("sum_price", sumPrice, "sum_id", sumId).toMap());
Map<String, Map<String, Object>> grouped = StreamEx.of(positions)
        .groupingBy(m -> m.get("Mod") + "<|>" + m.get("bigger"), collector);

除了本部分外,此功能在整个程序中完美运行:

char * addValue(char * msg){
    char * input[80];
    printf("%s", msg);
    fflush(stdout);
    fgets(*input, 80, stdin);
    strtok(*input, "\n");
    return *input;
}

我完全不知道为什么第二个函数调用不起作用。我在程序中有其他函数,我多次调用addValue()函数而没有任何错误。

当我使用gdb调试时,我得到了这个结果:

struct User{
    char userid[10];
    char email[80];
    char name[80];
    char password[80];
    char downloaded[10];
    char registred[10];
};

int change() {
    char * query = "SELECT * FROM Users WHERE user_id=";
    char * userid = addValue("Enter the User ID: "); // Works here
    // Here is a MySQL query
    char * email = addValue("Mail: "); // -> Segmentation Fault
    printf("%s\n", email);
    struct User usrvalues;
    strcpy(usrvalues.email, email);
    return 0;
}

Program received signal SIGSEGV, Segmentation fault. 0x00007ffff6445b77 in __GI__IO_getline_info () from /usr/lib/libc.so.6 给了我以下信息:

bt

我尝试了不同的输入(&#34;&#34;(一个空字符串),不同的数字,如100和不同的字符串,如&#34; test&#34;),但它每次以分段错误结束

我做错了什么?

1 个答案:

答案 0 :(得分:3)

input是一个未初始化的指针数组。通过执行*input,您将获得第一个未初始化的指针,并将其传递给fgets

我确定你并不是要创建一个指向char的数组,而是一个char的数组:

char input[80];

但是,你有一个比这更严重的问题,因为你然后返回一个指向这个本地数组input的指针(好吧,在你上面描述的更改之后),这会导致未定义的行为因为局部变量是局部变量,所以当函数返回时它们会消失,并且会给你留下一个迷路指针。

你有两个解决这个问题的方法:第一个是在调用函数中声明数组,并将它(及其大小)传递给函数,就像传递input并将其长度传递给{{ 1}}现在。

第二种解决方案是使用fgets动态创建数组,然后在完成后再记住malloc