2017-03-08 63 views
0

我試圖在下面的程序中發現錯誤。這個程序有什麼問題? (字符串相關)

如果我輸入「This is a test」,則輸出顯示「This is A」。我試圖找出爲什麼「測試」丟失。

請幫我理解這個問題。提前致謝。

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

int main() 
{ 
    char str[1000], word[100]; 
    int i, j, length, is_word_started; 

    gets(str); 
    length=strlen(str); 
    is_word_started=0; 

    for(i=0, j=0; i<length; i++) 
    { 
     if(str[i]>='a' && str[i]<='z') 
     { 
      if(is_word_started==0) 
      { 
       is_word_started=1; 
       word[j]='A'+str[i]-'a'; 
       j++; 
      } 
      else 
      { 
       word[j]=str[i]; 
       j++; 
      } 
     } 
     else if(str[i]>='A' && str[i]<='Z' || str[i]>='0' && str[i]<='9') 
     { 
      if(is_word_started==0) 
      { 
       is_word_started=1; 

      } 
      word[j]=str[i]; 
      j++; 
     } 
     else 
     { 
      if(is_word_started==1) 
      { 
       is_word_started=0; 
       word[j]='\0'; 
       printf("%s\n", word); 
       j=0; 
      } 
     } 
    } 

    return 0; 
} 
+2

@usr你應該解釋[爲什麼獲取函數如此危險以至於不應該使用?](http://stackoverflow.com/q/1694036/613130) – xanatos

+0

@us令人遺憾的是,「經典」C通常不會「包括「如何編寫安全可靠的C代碼」一章:-) – xanatos

+0

編譯時,總是啓用所有警告,然後修復這些警告(不要隱藏它們)(對於'gcc',至少使用:' -Wall -Wextra -pedantic'我也使用:'-Wconversion -std = gnu11') – user3629249

回答

2

您必須重複

if(is_word_started==1) 
{ 
    is_word_started=0; 
    word[j]='\0'; 
    printf("%s\n", word); 
    j=0; 
} 

for()週期之外(在其}末)

否則,當你完成解析str,你word累積起來的字母「丟失」。

從技術上講,你可以短它:

if(is_word_started==1) 
{ 
    word[j]='\0'; 
    printf("%s\n", word); 
} 

,因爲之後你就不會再使用這些變量。

除了@usr建議的「從不使用gets()」以外,您應該正確設置word的大小:始終使用最壞的情況。如果str[1000]然後word[1000]