0

複数のスペースで文字列をトークン化しようとしています。たとえば"yes___no"、アンダースコアはスペースです。使用するstrtok(string, " ");

しかし、セグ フォールトが発生し、デバッグ後、2 番目の文字列をトークン化した後に表示され、"\024\002"この間違った文字列を出力するとエラーが発生します。

4

1 に答える 1

3

文字列リテラルは変更できません。

/* does not work */
char *data = "yes no";
strtok(data, " ");

上記は、 there:を書くことによって at スペースstrtokを壊そうとしますが、文字列リテラルは変更できません。代わりに試すdata'\0'data[3] = '\0';

/* works */
char data[] = "yes no";
strtok(data, " ");

編集:文字列リテラルを文字配列にコピーする

char *data = "string literal";
/* ... */
char *copy;
size_t datalen = strlen(data) + 1;
copy = malloc(datalen);
if (copy != NULL) {
    strcpy(copy, data);
    /* use copy now ... strtok(copy, " "); ... or whatever you need */
    free(copy);
} else {
    /* no memory. Tell user to upgrade computer :-) */
}
于 2010-11-14T23:17:35.167 に答える