2016-10-05 8 views
0

get_argumentsからNULLへの文字列の配列を取得する方法、またはexecv呼び出しで機能しない場合は、文字列の配列を取得する方法を調べようとしています。null文字列の配列を終了します

char ** get_arguments(const char * string) { 
    char * copy = strdup(string); 
    char * remove_newline = ""; 
    for(;;) { 
     remove_newline = strpbrk(copy, "\n\t"); 
     if (remove_newline) { 
      strcpy(remove_newline, ""); 
     } 
     else { 
      break; 
     } 
    } 
    char (* temp)[16] = (char *) malloc(256 * sizeof(char)); 
    char * token = strtok(copy, " "); 
    strcpy(temp[0], token); 
    int i = 1; 
    while (token && (token = strtok(NULL, " "))) { 
     strcpy(temp[i], token); 
     i++; 
    } 
    char * new_null; 
    //new_null = NULL; 
    //strcpy(temp[i], new_null); 
    if(!temp[i]) printf("yup\n"); 
    int c = 0; 
    for (; c <= i; c++) { 
     printf("%s ", temp[c]); 
    } 
    return temp; 
} 

find ./ -name *.hと同様に、スペースで区切られた文字列を読み込もうとしています。 execvに入力しようとしています。無関係なコードの

char (* arguments)[16] = (char **) malloc(256 * sizeof(char)); 

//...numerousライン

pid = fork(); 
if (pid == 0) { 
    arguments = get_arguments(input_string); 
    char * para[] = {"find", "./","-name", "*.h", NULL}; 
    execv("/usr/bin/find", (char * const *) arguments); 
    //printf("%s\n", arguments[0]); 
    printf("\nexec failed: %s\n", strerror(errno)); //ls -l -R 
    exit(-1); 
} 

私はparaためexecvコールでargumentsを交換するとき、それは意図したとおりに動作しますが、arguments戻りexec failed: Bad addressを呼び出そう。 NULLparaから削除すると、同じ問題が発生します。私はstrcpy(temp, (char *) NULL)を試しました。あなたが見たバージョンはget_argumentsであり、他の多くのことが思い出せません。からstrcpyへのコンパイルに失敗しました。

引数とテンポラリの宣言をchar ** arguments = (char *) malloc(256 * sizeof(char));に変更する `` char ** temp =(char *)malloc(256 * sizeof(char)); clears up警告:互換性のないポインタ型からの初期化but causes segfault on all calls to get_arguments`。

+0

私が最も混乱しています、私は宣言した配列空間の未使用領域がnullにデフォルト設定されていることを言って読んでほとんどの場所が、それが失敗した理由は、 '場合printf( "yup \ n"); '私が試みたすべての条件の下でテストします。 – Kebtiz

+1

'malloc()'の前にある '(char *)'キャストを削除することができます。 –

+0

ありがとうございます、それは '警告:互換性のないポインタ型からの初期化'をクリアしました。奇妙なのは、私が繰り返し使用したのが見た大会です。その明示的な型が必要な状況はありますか? – Kebtiz

答えて

1

あなたはこれをしたい:(!TEMP [i])と

char* temp[256]; // an array of 256 char*'s 
char * token = strtok(copy, " "); 
temp[0] = strdup(token); 
int i = 1; 
while (token && (token = strtok(NULL, " "))) { 
    temp[i] = strdup(token); 
    i++; 
} 
temp[i] = NULL; 
関連する問題