#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; } 优化这段代码,使其代码量最小
时间: 2024-03-10 20:47:16 浏览: 56
以下是代码量最小的优化:
```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` 语句简化为一行,将比较和交换合并在一起。虽然代码更加简洁,但是可读性稍微降低了一些。
相关问题
1. 编一个函数,将字符串s2连接到s1后面,不用strcat函数。(请填空)#include <stdio. h> #include <string. h> void mainO ( char s1[80], s2[40]; int i=0, j=0; gets(s1) ; gets(s2) ; /*查找定位s1的连接点(即结束符) */ 8灵静话/*将s2逐个字符复制到s1后,对应下标后移*/ /*手工对s1加结束符*/ printf( "The new string is:%s” ,s1);
#include <stdio.h>
#include <string.h>
void mystrcat(char s1[], char s2[]) {
int len1 = strlen(s1);
int len2 = strlen(s2);
int i, j;
for (i = len1, j = 0; j < len2; i++, j++) {
s1[i] = s2[j];
}
s1[i] = '\0';
}
int main() {
char s1[80], s2[40];
printf("Enter string s1: ");
gets(s1);
printf("Enter string s2: ");
gets(s2);
mystrcat(s1, s2);
printf("The new string is: %s\n", s1);
return 0;
}
#include <stdio.h> #include <string.h> void myrevstr(char s1[], char s2[]); //将字符串s2反转后存放在s1中 void myrevstr(char s1[], char s2[]) { int pos = 0; char *p = s2+strlen(s2)-1; while (p>= (1) ) { s1[pos] = *p; (2) ; pos++; } (3) ; } int main() { char s1[80]; myrevstr(s1, "HelloW"); printf("%s", s1);//输出为WolleH return 1; }
完善程序如下:
```
#include <stdio.h>
#include <string.h>
void myrevstr(char s1[], char s2[]); //将字符串s2反转后存放在s1中
void myrevstr(char s1[], char s2[]) {
int pos = 0;
char *p = s2 + strlen(s2) - 1;
while (p >= s2) {
s1[pos] = *p;
p--;
pos++;
}
s1[pos] = '\0';
}
int main() {
char s1[80];
myrevstr(s1, "HelloW");
printf("%s", s1);//输出为WolleH
return 0;
}
```
其中,需要注意的点有:
1. 在 `while` 循环中,判断条件为 `p>=s2`,即指针 `p` 没有超过字符串 `s2` 的起始地址。
2. 在循环中,先将 `p` 所指向的字符赋值给 `s1` 中的对应位置,再让指针 `p` 向前移动一位。
3. 循环结束后,需要在 `s1` 的末尾添加一个空字符 `\0`,以表示字符串的结束。
阅读全文