2017-04-25 2 views
-2

아래의 코드 조각과 관련된 문제점은 무엇입니까? 그것은 라인 # 25에서 실패합니다. 나는 그것이 왜 실패하고 있는지 이해하지 못하고있다.올바른 호출에도 불구하고 strtok이 실패 함

#include <stdio.h> 
#include <string.h> 

char linebuf[1024]="SET SLMSRVR 10.133.2.102: 50011"; 
char *tempStr; 
char *str; 

int main() 
{ 
    tempStr = calloc(1024, sizeof(char)); 

    strcpy(tempStr, linebuf+strlen("SET SLMSRVR")); 
    printf("1 tempStr: %s\r\n", tempStr); 

    str = strtok(tempStr, ":"); 
    printf("2 tempStr: %s\tstr: %s\r\n", tempStr, str); 

    if (str != NULL){ 
     printf("Server IP: %s\r\n",str); 
    } else { 
     printf("Error 1\r\n"); 
    } 

    str = strtok(tempStr, NULL); 
    printf("3 tempStr: %s\tstr: %s\r\n", tempStr, str); 
    if (str != NULL) { 
     printf("Port: %s\r\n", str); 
    } 

    return 0; 
} 

여기에 strtok를의 사양에서 알 수 있듯이, 먼저는 구분 기호 문자열로 호출 한 후 NULL으로, 두 경우 모두 첫 번째 인수 문자열을 구문 분석 할 수 있습니다. 두 번째 파싱에 실패합니다.

의견이 있으십니까?

+3

입니다 그리고 우리는 라인 # 25를 계산하는 거 야? –

답변

2

두 번째로 str = strtok (NULL, ":")으로 호출해야합니다.

2

나는 그것이 잘못되었다고 생각합니다.

str = strtok(tempStr, NULL); 

같은 전화 당신은 NULL로 구분 문자열로 포인터를 전달하고, 이해가되지 않습니다. 이전과 같은 문자열을 계속 파싱하려면 첫 번째 인수를 NULL으로 전달해야합니다.

C11 챕터 §7.24.5.8 (강조 광산) *) S2를 제한

char *strtok(char * restrict s1, 

CONST 숯불 인용;

strtok() 함수 호출의 순서는 문자열이 문자열이 s2에 의해 지적에서 문자로 구분되어 각각의 토큰의 시퀀스로 s1가 가리키는 나옵니다. 시퀀스의 첫 번째 호출에 null이 아닌 첫 번째 인수가 있습니다. 시퀀스의 후속 호출에는 첫 번째 인수가 null입니다.s2이 가리키는 구분 기호 문자열은 호출과 다른 일 수 있습니다.

아마 당신이 원하는

str = strtok(NULL, ":"); //or some other delimiter 
+0

감사합니다. 예, 알았어요. – Abu

관련 문제