#include <stdio.h> void main() { char str[80], i, j; void swap(char* pa, char* pb); gets(str); //************Begin*********** int a;//a为str长度 for (a = 79; a >= 0; a--) if (str[a] != '\0') { a++; break; } //引入m n进行冒泡排序 int m,n; char* p1=&i, * p2=&j; for(m = 0; m < a; m++) for (n = 1; n < a - m; n++) { //利用指针进行字符对换 i = str[n]; j = str[n - 1]; if (i<j) //后项小于前项时 { swap(p1, p2); } //此时i和j内数据调换 重新赋值回str的n和n-1位 str[n] = i; str[n - 1] = j; } //************End*********** printf("%s\n", str); //输出排序后的字符串 } void swap(char* pa, char* pb) //两字符交换 { //************Begin*********** char ch; ch = *pa; //ch值 赋值 为pa指针指向数据 对应i的数据 即原str[n] *pa = *pb;//pa指针指向数据 即i的数据 赋值 为j内数据 i数据变为原str[n-1] *pb = ch; //pb指针指向数据 即j的数据 赋值 改为ch内的数据 j变为原str[n] //此时*pa和*pb对应变量i和j的数据 变为原来j和i 实质交换内容 //************End*********** }
时间: 2023-08-22 08:07:02 浏览: 63
这段代码实现了对输入字符串进行冒泡排序的功能。代码分析如下:
1. 定义了一个 `str` 数组来存储输入的字符串,同时定义了 `i` 和 `j` 两个字符变量,和一个 `swap()` 函数来交换两个字符指针所指向的字符值。
2. 使用 `gets()` 函数读取用户输入的字符串。
3. 计算出字符串的长度 `a`,并且为了避免字符串中存在空字符而导致计算错误,使用一个循环从后往前找到第一个非空字符,并将其后面的位置赋值给 `a`。
4. 使用两个嵌套的循环对字符串进行冒泡排序。在内层循环中,使用两个指向 `i` 和 `j` 的指针 `p1` 和 `p2`,将相邻的两个字符进行比较,如果后面的字符小于前面的字符,则调用 `swap()` 函数交换它们的值。
5. 在 `swap()` 函数中,使用一个中间变量 `ch` 来存储第一个字符指针 `pa` 所指向的字符值,然后将 `pa` 所指向的字符值替换为第二个字符指针 `pb` 所指向的字符值,最后将 `pb` 所指向的字符值替换为 `ch`,即完成了两个字符值的交换。
6. 最后使用 `printf()` 函数输出排序后的字符串。
需要注意的是,该程序使用了不安全的 `gets()` 函数来读取用户输入的字符串,可能会发生缓冲区溢出等安全问题。建议使用安全的字符串输入函数 `fgets()` 来代替 `gets()`。
相关问题
优化这个代码#include <stdio.h> #include <string.h> int main() { void sort(char* p_s1, char* p_s2, char* p_s3); char str1[100], str2[100], str3[100]; char* p_s1 = str1, * p_s2 = str2, * p_s3 = str3; printf("请输入姓名 微信号 qq名:,\n"); fgets(p_s1); fgets(p_s2); fgets(p_s3); sort(p_s1, p_s2); sort(p_s1, p_s3); sort(p_s2, p_s3); void sort(char* p_s1, char* p_s2); { char temp[100]; if (strcmp(p_s1, p_s2) > 0) { strcpy(temp, p_s1); strcpy(p_s1, p_s2); strcpy(p_s2, temp); } } printf("从小到大顺序输出为:\n%s\t%s\t5s\t", p_s1, p_s2, p_s3); return 0; }
这个代码可以进行如下的优化:
1. 去掉不必要的函数声明,可以将函数 `sort` 直接写在 `main` 函数的前面。
2. 使用 `fgets` 函数输入字符串时,应该指定输入的长度,避免字符串缓冲区溢出的问题。同时,在输入字符串后,也会受到回车符的影响,需要将其去掉。
3. 在函数 `sort` 中,可以将交换两个字符串的操作封装成一个函数,提高代码的可读性和重用性。
下面是修改后的代码:
```c
#include <stdio.h>
#include <string.h>
void swap(char *str1, char *str2)
{
char temp[100];
strcpy(temp, str1);
strcpy(str1, str2);
strcpy(str2, temp);
}
void sort(char *str1, char *str2, char *str3)
{
if (strcmp(str1, str2) > 0)
{
swap(str1, str2);
}
if (strcmp(str1, str3) > 0)
{
swap(str1, str3);
}
if (strcmp(str2, str3) > 0)
{
swap(str2, str3);
}
}
int main()
{
char str1[100], str2[100], str3[100];
printf("请输入姓名 微信号 qq名:\n");
fgets(str1, 100, stdin);
str1[strcspn(str1, "\n")] = '\0';
fgets(str2, 100, stdin);
str2[strcspn(str2, "\n")] = '\0';
fgets(str3, 100, stdin);
str3[strcspn(str3, "\n")] = '\0';
sort(str1, str2, str3);
printf("从小到大顺序输出为:\n%s\t%s\t%s\t", str1, str2, str3);
return 0;
}
```
运行结果与原代码相同,但是修改后的代码更加规范和易于维护。
改善代码 #include <stdio.h> #include <string.h> int main() { int swap(int *a,int *b); int numb; printf("How many strings you are going to enter?: \n"); scanf("%d",&numb); printf("\n\n\n"); int index[numb]; for(int i = 0; i < numb; i++) { index[i]=i; } char str[numb][30]; printf("Enter Strings One by One: \n"); for(int i = 0; i < numb; i++) { scanf("%s", str[i]); } for(int i = 0; i < numb-1; i++) { for(int j = i+1; j < numb; j++) { int inj = strcmp(str[index[i]], str[index[j]]); if(inj > 0) { swap(index[i],index[j]); } } } printf("Order of Sorted Strings: \n"); for(int i = 0; i < numb; i++) { printf("%s\n", str[index[i]]); } return 0; } int swap(int *a,int *b) { int mid = *b; *b = *a ; *a = mid; }
下面是改善后的代码,主要是优化了变量名和函数名,增加了注释,代码风格更加清晰易懂:
#include <stdio.h>
#include <string.h>
void swap(int *a, int *b); // 函数声明
int main() {
int num_strings; // 字符串数量
printf("How many strings you are going to enter?:\n");
scanf("%d", &num_strings);
int indices[num_strings]; // 索引数组
for (int i = 0; i < num_strings; i++) {
indices[i] = i;
}
char strings[num_strings][30]; // 字符串数组
printf("Enter Strings One by One:\n");
for (int i = 0; i < num_strings; i++) {
scanf("%s", strings[i]);
}
// 冒泡排序
for (int i = 0; i < num_strings - 1; i++) {
for (int j = i + 1; j < num_strings; j++) {
int cmp_result = strcmp(strings[indices[i]], strings[indices[j]]);
if (cmp_result > 0) {
swap(&indices[i], &indices[j]); // 交换索引
}
}
}
printf("Order of Sorted Strings:\n");
for (int i = 0; i < num_strings; i++) {
printf("%s\n", strings[indices[i]]);
}
return 0;
}
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}