#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-15 15:43:25 浏览: 31
这段代码是一个简单的字符串处理程序,它的作用是将两个字符串数组中不重复的单词合并到一个新的字符串数组中。它定义了一个函数 T,该函数以两个参数 s1 和 s3 作为输入,其中 s1 是一个字符串数组,s3 是一个字符数组。函数的主要功能是遍历 s1 中的所有单词,如果该单词不在 s3 中出现过,则将该单词添加到 s3 中。最后,程序输出 s3 中的所有单词。
具体实现过程如下:
1. 首先,定义一个指针 s1 和计数器 count,用于遍历 s1 中的每个单词和记录单词出现次数。
2. 然后,对于每个单词,遍历 s3 中的所有单词,如果该单词已经存在于 s3 中,则将计数器 count 加 1。
3. 如果计数器 count 为 0,则说明该单词还没有出现过,将该单词添加到 s3 中。
4. 最后,将指针 s3 向后移动一个位置,以便下一个单词添加到正确的位置。
5. 在主函数中,定义了两个字符串数组 s1 和 s2,分别存储了一些单词,然后调用函数 T 将两个数组中不重复的单词合并到 s3 中,最后输出 s3 中的所有单词。
这段代码的输出结果应该是:while for switch if continue break case do else char
相关问题
#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; }这个代码有什么问题
这段代码存在一个问题,即在最后输出 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;
}
```
这样修改后,程序会正确输出所有单词,不会有多余的垃圾值。
#include <stdio.h> #include <string.h> void print_strings(char* s1, char* s2, char* s3) { if (strcmp(s1, s2) <= 0 && strcmp(s1, s3) <= 0) { printf("%s\n", s1); if (strcmp(s2, s3) <= 0) { printf("%s\n%s\n", s2, s3); } else { printf("%s\n%s\n", s3, s2); } } else if (strcmp(s2, s1) <= 0 && strcmp(s2, s3) <= 0) { printf("%s\n", s2); if (strcmp(s1, s3) <= 0) { printf("%s\n%s\n", s1, s3); } else { printf("%s\n%s\n", s3, s1); } } else { printf("%s\n", s3); if (strcmp(s1, s2) <= 0) { printf("%s\n%s\n", s1, s2); } else { printf("%s\n%s\n", s2, s1); } } } int main() { char s1[200], s2[200], s3[200]; scanf("%s", s1); scanf("%s", s2); scanf("%s", s3); print_strings(s1, s2, s3); return 0; } 优化这段代码,使其代码量最小
以下是代码量最小的优化:
```c
#include <stdio.h>
#include <string.h>
#define swap(a, b) { char tmp[200]; strcpy(tmp, a); strcpy(a, b); strcpy(b, tmp); }
int main() {
char s1[200], s2[200], s3[200];
scanf("%s%s%s", s1, s2, s3);
if (strcmp(s1, s2) > 0) swap(s1, s2);
if (strcmp(s1, s3) > 0) swap(s1, s3);
if (strcmp(s2, s3) > 0) swap(s2, s3);
printf("%s\n%s\n%s\n", s1, s2, s3);
return 0;
}
```
这里我们使用了宏定义来实现字符串交换操作。另外,我们使用了一些技巧,如将 `scanf` 语句简化为一行,将比较和交换合并在一起。虽然代码更加简洁,但是可读性稍微降低了一些。
阅读全文