-1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void split_line(char **fields, char *line);

int main() {
    char *fields[5];
    char *line = "donuts,are,cool,and,tasty";
    int i = 0;

    split_line(fields, line);

    return 0;
}

void split_line(char **fields, char *line) {
    int i = 0;
    char *token, *delim;
    delim = ",\n";
    token = strtok(line, delim);
    while (token) {
        fields[i] = malloc(strlen(token));
        strcpy(fields[i], token);
        token = strtok(NULL, delim);
        i++;
    }

}

我是 C 的新手,并且在一个小时的大部分时间里一直试图弄清楚如何修复这个错误。它编译但在运行时我得到

总线错误:10。

如果有人能引导我了解为什么会发生这种情况以及我做错了什么,我将不胜感激。

4

2 回答 2

0

因为您不能修改字符串文字,所以它是不合法的。像这样试试

char line[] = "donuts,are,cool,and,tasty";

另外,尝试在strtok()不修改输入字符串的情况下学习除此之外的其他内容,因为strtok()这样做,这就是您收到错误的原因。

作为建议,请始终使用const字符串文字

const char *line = "donuts,are,cool,and,tasty";

编译器将帮助您了解您正在尝试做坏事。

此外,您malloc()的角色比您需要的少 1 个。字符串需要长度字符 + 1,最后一个字符是null终止符,如果要将数据用作字符串,则始终需要它,所有str函数都希望该值存在,因此您需要为其分配空间,并且也复制一下

size_t length = strlen(token);
fields[i] = malloc(length + 1);
if (fields[i] != NULL) {
    strcpy(fields[i], token);
}
于 2017-03-20T22:09:05.080 回答
0

这可能是您分配不正确的情况。如果您有权访问strdup,请尝试使用:

fields[i] = strdup(token);

您有责任最终释放分配的内存。

于 2017-03-20T22:21:49.593 回答