2017-08-24 8 views
0

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*引数でプログラムがクラッシュするのですか?

+0

TL:は、この問題の文字列リテラルを変更しようとするというセクションを参照してください。あなたが持っているものはあなたが触れることができないメモリへのポインタですので、そのデータを変更してください。 'char [] str =" "'あなたがしたいことを何でもすることができるコピーです。 – Chad

答えて

1

機能が含まれているので:それに渡された文字列を変更し

*(str++) = 0; 

。あなたがするとき:

char *str = "abc/def/foo/bar"; 

strは、読み取り専用の文字列リテラルを指します。あなたは `str`を変更しますが、` char型の* strを行うとき= "" `あなたがすることはできません:; DR

Definitive List of Common Reasons for Segmentation Faults

+0

これは今や理にかなっています。 charポインタを書き込み可能にすることは可能ですか? – buddy2891

+0

リテラルの代わりに配列を指すようにします。 'char str [] =" xxx "; char * str1 = str; ' – Barmar

+0

ところで、あなたの関数は' strtok() 'と同じではありませんか? – Barmar

関連する問題