2014-05-23 18 views
1

實施例:重用的strtok的是給空

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


    int main() 

    { 
      char str[1024]; 
      char *buff,*temp, *result=NULL; 
      char tok[]=" "; 
      printf("enter string:\n"); 
      gets(str); 

      buff=str; 


      result= strtok(buff,tok); 

      while(result != NULL) 
      {  
        printf("%s\n",result); 
        result = strtok(NULL,tok); 

      } 


printf("\n"); 

      char tok1[]= " "; 
      temp=str; 
      result= strtok(temp,tok1); 

      while(result != NULL) 
      {  
        printf("%s\n",result); 
        result = strtok(NULL,tok1); 

      } 



    } 
**Output coming :**  



enter string: 
    Hello how are you 
    Hello 
    how 
    are 
    you 

    Hello 


    **But It should give:** 



enter string: 
Hello how are you 
Hello 
how 
are 
you 

Hello 
how 
are 
you 

爲什麼函數strtok打印第一個字之後給予空(即你好)。 我正在使用另一個變量,並初始化它,也使用另一個標記變量以及如何獲得期望結果? strtok是否需要重複使用它

回答

3

strtok()修改輸入字符串。因此,在第一輪標記後,原始字符串str已被修改(因爲temp指向str)。

因此,在之前將字符串的副本傳遞給strtok()

其他方面的改進:

1)不要使用gets()已被棄用。改爲使用fgets()以避免潛在的緩衝區溢出。
2)使用strtok_r(),因爲它是重入者。

+0

但我沒有在strtok內使用str ..我使用了buff。 –

+0

'strtok()'不會修改輸入字符串。它將一個靜態指針內部存儲到最後一個令牌返回後的字符串中的位置,並在隨後的調用中使用該指針。 'strtok_r()'是非標準的,所以你應該在你的帖子中提到當他告訴他替換使用標準庫函數時。 –

+3

@ user3065636:'buff'是一個'char *',這意味着它的值只是一個指向'str'(str的第一個字符的內存地址)的開始處的指針。所以'buff'只是指向'str'_,這就是'strtok'在這裏改變的地方 –