2016-06-29 2 views
0

사용자 입력을 C에서 문자열 배열로 분할하려고합니다. 시간의 40 %를 사용합니다. 때로는 사용자가 문자열을 입력하고 모두 예상대로 진행됩니다. 때로는 동일한 문자열이 입력되고 배열의 내용이 달라집니다. 나는 이유를 알 수 없다.일관성없는 배열 내용을 C

void run_game(struct board *made_board){ 
    char **user_command; 

    user_command = (char **)malloc(sizeof(char *)*4); 
    user_command = split_string(user_command); 

    printf("Input1: %s\n", user_command[0]); 
    printf("Input2: %s\n", user_command[1]); 
    printf("Input3: %s\n", user_command[2]); 
} 

char** split_string(char **user_input){ 
    char user_command[10]; 
    char *word; 
    int word_counter = 0; 

    fgets(user_command, 10, stdin); 
    while(strlen(user_command)>9){ 
     fgets(user_command, 10, stdin); 
    } 

    word = strtok (user_command," "); 
    user_input[word_counter] = word; 
    word_counter++; 

    while (word != NULL){ 
     word = strtok (NULL, " "); 
     user_input[word_counter] = word; 
     word_counter++; 
    } 
    return user_input; 
} 

입력 1, 입력 2 및 입력 3은 때때로, 때때로 임의의 문자 일 무슨는 fgets에서 제공 될 것입니다. 이것은 정확히 동일한 입력에 대해 두 가지 다른 동작입니다.

+0

[초기화되지 않은 포인터에 데이터를 복사 할 때 왜 신비한 충돌이 발생하거나 "세분화 오류가 발생합니까?"(http://stackoverflow.com/questions/37549594/why-do-i-get-a)를 참조하십시오. - i-copy-data-to-an-u 일 때 이상한 - 크래시 또는 세그멘테이션 오류. – Lundin

답변

0

올바른 복사를하지 않고 로컬 배열 commanduser_input의 메모리에 포인터를 삽입하는 것이 문제입니다. 이로 인해 정의되지 않은 동작이 발생합니다.

당신이 할 때이

word = strtok (user_command," "); 

wordchar user_command[10] 내부를 가리키는 포인터를 가져옵니다. user_input[word_counter]에 삽입하려면 문자열을 복제하십시오. strdup이 가능하며, 당신이 그것을 사용 괜찮다면

, 간단한 솔루션은 또한 사용할 수 있습니다

user_input[word_counter] = strdup(word); // You need to do it in two places 

것이다 당신의 this Q&A에 설명 된대로 strdup 자신.