2013-07-15 51 views
0

我試圖標記一個sting,這裏是我的嘗試。使用指針標記字符串

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不是持久化的,當主函數調用tokenize_next()時,new_str變成了句子的第一個單詞。提前致謝。

+1

是否有任何特定的原因導致您不僅僅使用'strtok()'來標記字符串? –

+0

http://www.elook.org/programming/c/strtok.html可能會有所幫助 – 2013-07-15 18:35:12

+1

「strsep」不是新的熱點嗎? –

回答

1

,它只是打印出的原因「這」是因爲你迭代到這恰好是一個空間的第一個非字母字符,和你在這行空終止字符替換此:

new_str[i] = '\0'; 

之後,對字符串的其餘部分做什麼並不重要,它只會打印到該點。下一次調用tokenize_next時,字符串的長度不再是您認爲的長度,因爲它只計算單詞「This」,並且由於「i」已經達到該量,函數將返回,因此每次連續調用它:

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

要修復此功能,您需要以某種方式更新您的指針,以便在下一次迭代中查看該字符。

但是,這非常糟糕。您是關使用所提到的功能,如strtokstrsep一個更好的

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