複数のスペースで文字列をトークン化しようとしています。たとえば"yes___no"
、アンダースコアはスペースです。使用するstrtok(string, " ");
しかし、セグ フォールトが発生し、デバッグ後、2 番目の文字列をトークン化した後に表示され、"\024\002"
この間違った文字列を出力するとエラーが発生します。
文字列リテラルは変更できません。
/* 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 :-) */
}