2017-03-08 64 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]