2017-11-12 57 views
-2

"tmp"で文字列を分割し、ポインタ "arr"の配列に入れようとしています。私は "arr"に "execv"を使用しようとしているのでこれをやっているが、 "arr"は最後にNULLがないのでできない。代わりに "(null)"があり、その内容を印刷するとセグメント化エラーが発生します。 "arr"をexecvで使用できるように正しく設定するには?おかげstrtok()に関する問題

#include<stdio.h> 
#include<sys/wait.h> 
#include<stdlib.h> 
#include<string.h> 

int main(){ 

    char tmp[40] = "echo Hello World \n "; 
    char *arr[40]; 

    char *token = strtok(tmp, " \n"); 
    int index = 0; 

    while(token != NULL){ 
     arr[index] = malloc(strlen(token) + 1); 
     arr[index] = token; 

     index = index + 1; 
     token = strtok(NULL, " \n"); 
    } 


    for(int i = 0; i < 40; i++){ 
     printf("%s \n", arr[i], arr[i]); 
    } 


    return 0; 

} 

答えて

2

ここでは大きな問題です:

arr[index] = malloc(strlen(token) + 1); 
arr[index] = token; 

あなたは文字列をコピーしません、代わりにあなたはポインタを上書きします。あなたは、文字列をコピーするstrcpyを使用する必要があります。

strcpy(arr[index], token); 

この場合、ちょうど割り当てが行います、しかし、文字列をコピーするために必要とされない場合があります。つまり、割り当ては必要ありません。


さらにコードに問題があります。arrに文字列を印刷するループです。

文字列には、arrで有効な3つの要素のみがあり、残りは初期化されず、は未定義です。それらを逆参照すると(指し示す "文字列"を印刷しようとするときのように)undefined behaviorになります。

arrを初期化する前のループの後に、indexarrの有効な要素の数になります。これを印刷ループの最後に使用してください:

for(int i = 0; i < index; i++){ ... }