这两个程序哪一个好一点,为什么?该如何处理
这两个程序哪一个好一点,为什么?
题目:输入一行字符串,统计其中有多少个单词,单词之间用空格分隔开。
//code 2
------解决方案--------------------
获取字符串用fgets()比较好,避免缓冲区溢出
------解决方案--------------------
用指定分词,完全可以用strtok。。肯定比自己写好一些
------解决方案--------------------
题目:输入一行字符串,统计其中有多少个单词,单词之间用空格分隔开。
- C/C++ code
//code 1 void main() { char str[81]; int count=0,i; gets(str); for(i=0;str[i]!='\0';i++) { if(str[i]==' ' && str[i+1]>='a' && str[i+1]<='z')//如果一个字符后面是字母,表示一个单词开始 { count++; } } if(str[0]!=' ')//如果一句话开头不是空格而是单词,上面的方法,会把第一个词漏掉,这里补上 { count=count+1; } printf("There are %d words in the line.\n",count); }
//code 2
- C/C++ code
void main() { char string[81]; int i,num=0,word=0;//num单词数累加 char c; gets(string); for(i=0;(c=string[i])!='\0';i++) { if(c==' ')//c是空格,word置0 { word=0; } else if(word==0)//c不是空格,并且前面一个字符是空格(即word=0),新单词开始,num累加,word置1 { word=1; num++; } } printf("There are %d words in the line.\n",num); }
------解决方案--------------------
获取字符串用fgets()比较好,避免缓冲区溢出
------解决方案--------------------
用指定分词,完全可以用strtok。。肯定比自己写好一些
------解决方案--------------------
- C/C++ code
int main() { char str[81]; char *taken; int count=0,i; gets(str); taken = strtok( strdup(str)," "); while (taken != NULL) { count ++; taken = strtok( NULL," "); } printf("There are %d words in the line.\n",count); }
------解决方案--------------------
严格来说,楼主这两段程序并不等价。
第一段程序只判断了小写字母所组成的单词,而第二段则没有限制.
1楼已经提了,gets输入不检查越界,可能会溢出。这也是一个不安全的因素。用fgets是可以,但要注意最后可能会将回车符保存到字符串。
当然,也可以自己写一个函数。如:
- C/C++ code
/*接受输入的前n个字符保存到str中*/ char *getline(char *str, int n) { int ch; int len = 0; while((ch=getchar()) != '\n' && len < n) { str[len++] = ch; } str[len] = '\0'; return str; } 个人倾向于用你的第二段代码。
------解决方案--------------------
噢,第二个能处理末尾。。也能处理头空格,第二个好!