-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 を初めて使用し、このエラーを修正する方法を 1 時間ほど探し続けました。コンパイルされますが、実行時に取得します

バス エラー: 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 文字少なくなります。文字列にはlength文字 + 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 に答える