2017-08-16 4 views
-7

私はsegフォルトがありますが、なぜわからないのですか? 私はそれが動作するはずですが、それは誰かが解決策を持っているsegの間違いがあることを私に教えてくれる? 私のBAについて知りたい人を助けてください。セグメンテーションフォルト、なぜわからない

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

int split_allocate(const char* s, char*** word_array){ 
    char c; 
    char tmp[100]; 
    int id_s,i=0, j=0,k; 
    for(id_s =0 ; (c=s[id_s])!='\0' ; id_s++){ 
     printf("%c\n", c); 
     if(c!=' ' && c!='\t' && c!='\n'){ 
      tmp[i]=c; 
      i++; 
      printf("i if : %d\n", i); 
      continue; 
     } 
     tmp[i]='\0'; 
     printf("i else : %d & tmp : %s\n", i, tmp); 
     (*word_array)[j] = (char*)malloc(sizeof(char)*(i+1)); 
     printf("666\n"); 
     if(NULL== (*word_array)[j]){ 
      return -1; 
     } 
     for(k=0 ; tmp[k] != '\0' ; k++){ 
      (*word_array)[j][k]=tmp[k]; 
     } 
     (*word_array)[j][k+1]='\0'; 
     j++; 
     printf("j for : %d\n", j); 
     i=0; 
    } 
    return j; 
} 

int main(void) { 
    char* s = "Salut, cet examen\n a l'air long..."; 
    char*** word_array; 
    printf("number of words :%d\n", split_allocate(s,word_array)); 
    return 0; 
} 
+4

'word_array'はポインタですが、*役立つかもしれません* –

+0

不確定の間に自動保存期間を持つオブジェクトの値を使用するための未定義の動作。 – EOF

+3

また、[three-start programmer](http://wiki.c2.com/?ThreeStarProgrammer)は努力するものではありません。 –

答えて

1

私はあなたがctype.hから

if(!isspace(c)) // Iam easier and more readable 

if(c!=' ' && c!='\t' && c!='\n') 

を交換することをお勧めします。これは、すべてのこれらの文字

' '  space 
'\t'  horizontal tab 
'\n'  newline 
'\v'  vertical tab 
'\f'  feed 
'\r'  carriage return 

を検出した。また、あなたが十分にあるpointer to pointerchar*** word_array;(3つ星の一般的な)を変更する必要があります。次に、メモリをheapの動的記憶期間)に割り当てます。あなたはそれをやっていないし、segmentaion fault(初期化されていないポインタを間接参照しています)を引き起こしました。それはproblemsにつながる可能性があるため

char ** word_array = malloc (sizeof(char *) * ROWS); 
for (int i = 0; i < ROWS; ++i) 
{ 
    word_array[i] = malloc (sizeof(char) * ROW_LEN); 
} 

あなたはmalloc()の戻り値をキャストするべきではありません。

また、行数を確認し、必要に応じてさらに多くの行を取得するためにreallocを使用すると、範囲外にアクセスするとundefined behaviorになるためです。


文字単位で文字をコピーする代わりに、十分なスペースがあることがわかっているので、strcpyを使用してください。その読みやすさと容易さ。

strcpy(word_array[j], tmp); // In case word_array is char ** 

for(k=0 ; tmp[k] != '\0' ; k++){ 
    (*word_array)[j][k]=tmp[k]; 
} 

私はあなたの文字列にスペースを見ることができますが、それらをskipingアレント、これは

while ((c=s[id_s++]) && isspace(c)) 
    ; 
関連する問題