2013-07-15 3 views
0

나는 토핑을 토큰 화하려고 시도하고 있으며, 여기에는 내 시도가 있습니다.포인터를 사용하여 문자열에 토큰 화하기

char new_str[1024]; 
void tokenize_init(const char str[]){//copy the string into global section 
    strcpy(new_str,str); 
} 

int i = 0; 
char *tokenize_next() { 
    const int len = strlen(new_str); 
    for(; i <= len; i++) { 
    if (i == len) { 
    return NULL; 
    } 
    if ((new_str[i] >= 'a' && new_str[i] <= 'z') || 
    (new_str[i] >= 'A' && new_str[i] <= 'Z')) { 
    continue; 
    }else { 
    new_str[i] = '\0'; 
    i = i + 1; 
    return new_str; 
    } 
} 
    return NULL; 
} 

//main function 
int main(void) { 
    char sentence[] = "This is a good-sentence for_testing 1 neat function."; 
    printf("%s\n", sentence); 
    tokenize_init(sentence); 
    for (char *nt = tokenize_next(); 
    nt != NULL; 
    nt = tokenize_next()) 
printf("%s\n",nt); 
} 

그러나 문장의 첫 번째 단어 ("This")를 인쇄 한 다음 중지합니다. 누군가 왜 저에게 말할 수 있습니까? 내 생각 엔 내 new_str은 영구적이지 않으며 main 함수가 tokenize_next()를 호출하면 new_str이 문장의 첫 단어가됩니다. 미리 감사드립니다.

+1

'strtok()'를 사용하여 문자열을 토큰 화하는 특별한 이유가 있습니까? –

+0

http://www.elook.org/programming/c/strtok.html 도움이 될 수 있습니다 –

+1

'strsep'가 새로운 인기가 아닌가요? –

답변

1

단지 밖으로 인쇄하는 이유 당신이 공간이 될 일이 아닌 첫 번째 문자 문자로 반복하기 때문에 "이", 당신은이 라인에서 널 종료 문자와 이것을 대체 :

new_str[i] = '\0'; 

그 다음에는 문자열의 나머지 부분에 무엇을 할 지 중요하지 않으며, 그 시점까지만 인쇄 할 것입니다. 다음에 tokenize_next가 호출 될 때 문자열의 길이는 더 이상 "This"라는 단어를 계산하기 때문에 더 이상 생각하지 않으며 "i"는 이미 그 양에 도달했기 때문에 함수가 반환하므로 모든 연속 호출이 수행되므로 :

if (i == len) 
{ 
    return NULL; 
} 

이 기능을 수정하려면 다음 반복에서 해당 문자를 지나치게 보도록 포인터를 업데이트해야합니다.

그러나 이것은 상당히 불안정합니다. 당신은 strtok 또는 strsep로 언급 된 기능 중 하나를 사용하여 오프 더 나은

UPDATE : 당신이 그 기능을 사용할 수없는 경우

는 다음 기능의 재 설계가 귀하의 요청에 따라, 그러나, 이상적 일 것이다, 다음의 수정을 시도하십시오 :

#include <string.h> 
#include <cstdio> 

char new_str[1024]; 
char* str_accessor; 

void tokenize_init(const char str[]){//copy the string into global section 
    strcpy(new_str,str); 
    str_accessor = new_str; 
} 

int i = 0; 

char* tokenize_next(void) { 
    const int len = strlen(str_accessor); 

    for(i = 0; i <= len; i++) { 

     if (i == len) { 
     return NULL; 
     } 

     if ((str_accessor[i] >= 'a' && str_accessor[i] <= 'z') || 
     (str_accessor[i] >= 'A' && str_accessor[i] <= 'Z')) { 
     continue; 
     } 
     else { 
     str_accessor[i] = '\0'; 

     char* output = str_accessor; 
     str_accessor = str_accessor + i + 1; 

     if (strlen(output) <= 0) 
     { 
      str_accessor++; 
      continue; 
     } 

     return output; 
     } 
    } 
    return NULL; 
} 

//main function 
int main(void) { 

    char sentence[] = "This is a good-sentence for_testing 1 neater function."; 
    printf("%s\n", sentence); 

    tokenize_init(sentence); 
    for (char *nt = tokenize_next(); nt != NULL; nt = tokenize_next()) 
     printf("%s\n",nt); 
} 
+0

이것은 책에 대한 연습이며 제한 사항은 strtok 및 strsep와 같은 것을 사용할 수 없다는 것입니다. 더 나은 방법으로 이러한 기능을 구현할 생각이 있습니까? – OKC

+0

당신은 내가 "다음 반복에서 그 캐릭터를 지나치게 보도록 포인터를 업데이트해야"한다고 말합니다. 어떻게 설명 할 수 있니? 고맙습니다. – OKC

+0

@OKC 답변. 이 요구 사항을 충족하는 경우 녹색 확인 표시를 선택하는 것을 잊지 마십시오. 감사합니다 – dtmland

관련 문제