Iトークンで文字列を分割するために、次のコードを持っている:のchar []がないのに対し、引数の区切りプログラムとしてのchar *を渡し
char **strToWordArray(char *str, const char *delimiter)
{
char **words;
int nwords = 1;
words = malloc(sizeof(*words) * (nwords + 1));
int w = 0;
int len = strlen(delimiter);
words[w++] = str;
while (*str)
{
if (strncmp(str, delimiter, len) == 0)
{
for (int i = 0; i < len; i++)
{
*(str++) = 0;
}
if (*str != 0) {
nwords++;
char **tmp = realloc(words, sizeof(*words) * (nwords + 1));
words = tmp;
words[w++] = str;
} else {
str--;
}
}
str++;
}
words[w] = NULL;
return words;
}
私はこれを行う場合:その後、
char str[] = "abc/def/foo/bar";
char **words=strToWordArray(str,"/");
プログラムうまく動作しますが、私がこれを行う場合:
char *str = "abc/def/foo/bar";
char **words=strToWordArray(str,"/");
私はセグメント違反を取得します。
なぜですか?プログラムはchar*
を引数として想定していますが、なぜchar*
引数でプログラムがクラッシュするのですか?
TL:は、この問題の文字列リテラルを変更しようとするというセクションを参照してください。あなたが持っているものはあなたが触れることができないメモリへのポインタですので、そのデータを変更してください。 'char [] str =" "'あなたがしたいことを何でもすることができるコピーです。 – Chad