2013-10-16 3 views
0

strtok을 사용하여 구분 기호를 사용하여 문자열을 분할하려고 시도했지만 분할 오류가 발생합니다. 제strtok을 사용하여 분할 오류가 발생했습니다.

EDIT의 시점

char command[12]; 
    char *instruction; 
    char *parameter_1; 
    char *parameter_2; 
    *instruction = strtok(command, " ,.-"); 
    *parameter_1 = strtok(NULL, " ,.-"); 
    *parameter_2 = strtok(NULL, " ,.-"); 
    write(1,parameter_1,sizeof(parameter_1)); 

: 요청 같이, 컴파일러 경고. 어디서나 int를 사용하지 않으므로 혼란 스럽습니다.

shell.c:51:16: warning: assignment makes integer from pointer without a cast [enabled by default] 
shell.c:52:16: warning: assignment makes integer from pointer without a cast [enabled by default] 
shell.c:53:16: warning: assignment makes integer from pointer without a cast [enabled by default] 

Command: abd def ghj 
Segmentation fault (core dumped) 

편집 2 :

int prompt() { 
    // Get Input 
    char inputData[256]; 
    int rid; 
    rid = read(0,inputData,256); 

    // Strip input 
    char command[rid]; 
    int i; 
    for (i = 0; i<=rid-2; i++) { 
     command[i] = inputData[i]; 
    } 
    command[rid-1] = '\0'; 

    // Debug 
    // printf("\n-%c-%i\n",command[10],(int)sizeof(command)); 
    // write(1,command,sizeof(command)); 

    if (strcmp(command, "exit") == 0) { 
     break; 
    } 

    char *instruction; 
    char *parameter_1; 
    char *parameter_2; 
    instruction = strtok(command, " "); 
    parameter_1 = strtok(NULL, " "); 
    parameter_2 = strtok(NULL, " "); 
    write(1,instruction,sizeof(instruction)); 
    //write(1,parameter_2,sizeof(parameter_2)); 
} 

return 0; 

}

+2

경고와 함께 컴파일하십시오. 컴파일 가능한 예제를 붙여 넣으면 부분 코드 단편에 표시되지 않은 미묘한 부분이있을 수 있습니다. Https://sscce.org – hyde

+1

또한 표시된 코드 조각은 초기화되지 않은 포인터를 derefererences, 일반적으로 즉시 충돌합니다. – hyde

+1

그래, 모든 경고를 제거했을 때 컴파일러 경고를 켜고 돌아온다;) –

답변

1

수정은 다음과 같이

char command[12]; 
char *instruction; 
char *parameter_1; 
char *parameter_2; 
instruction = strtok(command, " ,.-"); 
parameter_1 = strtok(NULL, " ,.-"); 
parameter_2 = strtok(NULL, " ,.-"); 
write(1,parameter_1,sizeof(parameter_1)); 

(제거됨 *)

+0

테스트 결과, 명령에 'abc def ghi \ 0'이 포함되어있을 때 여전히 명령이 인쇄됩니다. –

+2

'sizeof()'를'strlen() ', 출력을위한 개행을 걱정한다. –

2

나는이 의견에 게시 된 :

*instruction = strtok(command, " ,.-"); 
*parameter_1 = strtok(NULL, " ,.-"); 
*parameter_2 = strtok(NULL, " ,.-"); 

이는 char 문자 수 (가 배열이 아니다)하지만 포인터의 크기를 반환하지 않습니다

instruction = strtok(command, " ,.-"); 
parameter_1 = strtok(NULL, " ,.-"); 
parameter_2 = strtok(NULL, " ,.-"); 
또한

sizeof(instruction)와 relaced해야한다 (즉, 명령, PARAM_1, PARAM_2가 정말 무엇)를 컴퓨터에 설치하십시오. 바이트에
write() 또는 fwrite() 일, 그들은 '\0'에 중단되지 않도록 그 의미를 확인하지 않고 : OP 주석에 대한 응답으로

.
fprintf(), fputs()은 문자열에서 작업하도록 준비되어 있으므로 '\0' char가 중지되는지 확인합니다.

+0

위의 코드 샘플을 참조하십시오. –

+0

그래도 defghi를 출력 할 때 def가 null 문자를 가진 문자열 일 때 f가 끝난 다음에는이 null 문자 다음에 멈추지 않아야한다. –

+0

아니요, 쓰기는 문자가 아닌 바이트에서 작동합니다. 그리고 '\ 0'은 null 바이트입니다.printf ("% s")와 같은 문자 배열을 처리하는 함수 나 바이트를 처리하는 함수는 바이트가 의미하는 바를 찾지 못합니다. 단지 0과 1의 부분입니다 – zubergu

0

명령은 문자열 리터럴이며 ROM에 있습니다. 어쩌면 memcpy()를 사용하여 로컬 변수에 복사 한 다음 strtok()에서 사용하십시오.

+0

'command '코드에서 문자열 리터럴로서 정의됩니다 :'char command [rid];' –

관련 문제