使用strtok进行分段故障并存储到变量中?

时间:2017-09-14 04:44:32

标签: c

我试图使用" strtok"将用户输入分成4个部分。所以一个示例字符串看起来像" john 1.3 2.4 3"。

我想将第一个存储在字符数组中,第二个和第三个存储为浮点变量,最后一个存储为整数。

首先,我尝试使用scanf并将变量存储到所需的位置。 我被告知使用fgets并拆分字符串会更好。我的代码如下所示:

    char Input[4];
    char names[5];
    struct numbers
    {
        float start;
        float end;
        int rows;
    }values;

    fgets(Input, sizeof(Input), stdin);
    token = strtok(Input, " ");

    strcpy(names, token);
    values.start = atof(strtok(NULL, " "));
    values.end = atof(strtok(NULL, " "));
    values.rows= atoi(strtok(NULL, " "));

输入用户输入后出现分段错误。 我怎么解决这个问题? 使用scanf更好吗?

2 个答案:

答案 0 :(得分:1)

char Input[40];
char names[5];
char *token;
struct numbers
{
    float start;
    float end;
    int rows;
}values;

fgets(Input, sizeof(Input), stdin);
token = strtok(Input, " ");

strcpy(names, token);

values.start = atof(strtok(NULL, " "));
values.end = atof(strtok(NULL, " "));
values.rows= atoi(strtok(NULL, " "));

printf("%s\n %.1f\n %.1f\n %d",names,values.start,values.end,values.rows);

增加Input数组的大小。

答案 1 :(得分:1)

解决方案:请增加"输入"。

的大小
  

问题原因:根据您的代码"输入"只能有四个   字符。因此,当输入字符串超过4个字符时," strtok"尝试   读取数据超出边界,可能导致分段错误。