2016-10-22 7 views
0

Cで文字列を分割する際に問題があります。コードを実行しようとするたびに、「セグメント化エラー」エラーが発生します。しかし、私は問題が何であるかはよく分かりません。C - 複数の部分に分割する文字列

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

char** string_array = NULL; //string array for the split method 

    static int split_string(char* string, char* delimiter) 
    { 
     char* part = strtok(string, delimiter);//string which is getting split out by strtok 
     int number_of_parts = 0;//number of strings 

     /*split string into multiple parts*/ 
     while(part) 
     { 
      string_array = realloc(string_array, sizeof(char*)* ++number_of_parts); 

      if(string_array == NULL)//allocation failed 
       return -1; 

      string_array[number_of_parts-1] = part; 
      part = strtok(NULL, delimiter); 
     } 

     /*write final null into string_array*/ 
     string_array = realloc(string_array, sizeof(char*)* (number_of_parts+1)); 
     string_array[number_of_parts] = 0; 

     return 0; 
    } 


int main() 
{ 
    char* string = "string1 string2 string3"; 
    printf("%d", split_string(string, " ")); 
    return 0; 
} 
+0

@ n.m。合意したが、OPがこの参照を見つけるのは難しい。 –

+0

再割り当てに失敗した場合、 'old_ptr = realloc(old_ptr、new_size)'構造はメモリをリークすることに注意してください。あなたは 'void * new_ptr = realloc(old_ptr、new_size);を使う必要があります。 if(new_ptr == 0){...ハンドルエラー...} old_ptr = new_ptr; '。そうすれば、まだ解放できる 'old_ptr'に有効なポインタがあります。 –

答えて

1

strtok()は文字列に書き込みます。したがって、引数として文字列リテラルを使用することはできません。可能な修正プログラムは、配列へのポインタから文字列を変更することです

char* string = "string1 string2 string3"; 

:問題のある行はこの1つである

char string[] = "string1 string2 string3"; 

GCCコンパイラオプション-Wwrite-文字列は、この種の問題のために警告します。

この警告は、gccのオプション-Wdiscarded-qualifiersから削除されています。 -Wall -Wextra -std = c99 -pedantic。

+0

もう一つの問題があります: 'strtok'の部分に' strdup'が必要な場合や、すべてのポインタに同じ文字列がある場合。 –

+0

レコードの場合:gccコンパイラオプション-Wwrite-stringsは、この種の問題を警告します。奇妙な理由から、この警告は-Wdiscarded-qualifiersから削除され、-Wall -Wextra -std = c99 -pedanticの一部ではありません。奇妙な。 –

+0

それはちょうどばかです!私は手動で問題を発見し、成功した壁を使用しました。すべての警告を得る方法を説明しているSOのリンクがありますか?すべての警告を意味しますか?情報のためのthx。この情報を追加するには、回答を編集する必要があります。 –