#include <stdio.h> #include <string.h> #define N 20 void T(char *s1,char *s3) { int z,sum,count; while(*s1) { count = 0; for(z=0;s3[z];z++) { sum = 1; sum = strcmp(&s3[z],s1); if (sum == 0) { count ++; } } if(count == 0) { strcpy(s3,s1); s3++; } s1++; } return; } int main() { char s1[6] = {"while","for","switch","if","continue","break"}; char s2[6] = {"for","case","do","else","char","switch"}; char s3[N] = {0}; int i; T(s1,s3); T(s2,s3); for(i = 0;i < 10;i++) { printf("%s ",s3[i]); } printf("\n"); return 0; }这个代码有什么问题
时间: 2024-03-14 15:45:05 浏览: 77
这段代码存在一个问题,即在最后输出 s3 中的所有单词时,使用了错误的循环条件。
在循环中,通过遍历 s3 数组中的每个元素来输出所有单词,但是循环的终止条件是 i < 10,这是错误的,因为数组 s3 的大小是 20。如果 s3 中的单词数量少于 10 个,那么循环会输出一些垃圾值,如果 s3 中的单词数量超过 10 个,那么循环会无法输出所有单词。
正确的循环条件应该是 i < strlen(s3),即遍历 s3 中实际存储的单词数量。修改后的代码如下:
```C
#include <stdio.h>
#include <string.h>
#define N 20
void T(char *s1,char *s3) {
int z,sum,count;
while (*s1) {
count = 0;
for (z = 0; s3[z]; z++) {
sum = strcmp(&s3[z], s1);
if (sum == 0) {
count++;
}
}
if (count == 0) {
strcpy(s3, s1);
s3++;
}
s1++;
}
return;
}
int main() {
char s1[6] = {"while","for","switch","if","continue","break"};
char s2[6] = {"for","case","do","else","char","switch"};
char s3[N] = {0};
int i;
T(s1, s3);
T(s2, s3);
for (i = 0; i < strlen(s3); i++) {
printf("%s ", &s3[i]);
}
printf("\n");
return 0;
}
```
这样修改后,程序会正确输出所有单词,不会有多余的垃圾值。
阅读全文