2015-01-22 8 views
0

나는이 바보 같은 문제가 C에서 strtok() 사용하여 발생했습니다. main 루틴 내 변경된 토큰을 참석하는 것으로 나타나지 않는 동일한 작동하는 동안 sub_routine에서 제가 다르게 수행 한 것은 static에 토큰 문자를 유지하는 것입니다.strtok() 후속 호출에서 새로운 토큰 값에 관한하지 않습니다

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

void sub_routine() 
{ 
    char str[80] = "This is { some important } website"; 
    char *val = NULL; 
    val = (char *)malloc(sizeof(char)*255); 
    strncpy(val, str, sizeof(str)); 
    static char s = '{'; 
    char *token; 

    /* get the first token */ 
    token = strtok(val, &s); 

    /* walk through other tokens */ 
    while(token != NULL) 
    { 
    printf(" %s\n", token); 
    s= '}'; 
    token = strtok(NULL, &s); 
    } 
} 

int main() 
{ 
    char symbol='{'; 
    char *string = NULL; 
    char *match = NULL; 
    char ref[255]="Do something here {Do it now}. What now?"; 

    string = (char *)malloc(sizeof(char) * 255); 
    strncpy(string, ref, sizeof(ref)); 

    match = strtok(string, &symbol); 
    printf("\n%s", match); 
    printf("\n%s", string); 
    if(string!= NULL) 
    { 
    symbol = '}'; 
    match= strtok(NULL, &symbol); 
    printf("\n%s\n", match); 
    } 
    sub_routine(); 
} 

누군가가 문제를 해결해 줄 수 있습니까?

+0

왜 'strtok'을 사용하고 있습니까? 이것은 표준 라이브러리 중 최악의 기능 중 하나입니다. – CodesInChaos

+2

구분 기호는 널로 끝나는 문자열로 지정해야합니다. 당신은 하나의 char에 포인터를 넘겨 주는데, 이것은 대부분 NULL로 끝나지 않는다. 's'를 배열로 만듭니다 :'char s [2] = "{";'. ('static' 변수는 0 바이트로 패딩되어 행동을 설명 할 수 있습니다.) –

+0

@CodesInChaos 당신이 제안한 대안은 무엇입니까? (재진입 버전 제외)? – Anshul

답변

1

프로토 타입

char * strtok (char * str, const char * delimiters); 

STR

C 문자열을자를 수 있습니다. 이 문자열은 작은 문자열 (토큰)으로 분리되어 수정됩니다. 대체로 null 포인터를 지정할 수 있습니다.이 경우 함수는 이전 성공한 함수 호출이 끝난 위치를 계속 검색합니다.

는 구분 문자를 포함

C 문자열을 구분 기호. 이러한 호출은 호출마다 다를 수 있습니다.

은 다음과 코드 변경

:

char symbol="{"을;

변수가 정적이기 때문에 서브 루틴에서 작동 할 수 있으며, RAM에 넣으면 그 뒤에 0x00이옵니다. 이것은 행운의 beacause 일할 수 있다는 것을 의미합니다 ...

+0

네, 그게 아마도 오류의 원인 일 겁니다.하지만 그것은'char *'이거나'const char *'일 것입니다. –

2

strtok문자열을 두 번째 인수로 요구합니다. 여기에서는 문자에 대한 포인터를 사용하고 있는데, 이는 1/2 정확합니다. 그러나 이 아닌은 NULL 종료입니다 ((char)0으로 끝나지 않음).

static char s = '{'; 

char symbol = '{'; 

static char *s = "{"; 

char *symbol = "{"; 

에 재정 및에 &s&symbol의 모든 항목을 대체은 ssymbol으로 각각 전화합니다.