使用C语言选择排序对输入的10个字符串进行从小到大地排序(代码简洁易懂使用puts和gets函数)
时间: 2025-06-06 13:39:14 浏览: 21
<think>嗯,用户让我用C语言写一个选择排序,对10个字符串进行从小到大的排序,还要用puts和gets函数,代码要简洁易懂。好的,首先我得回忆一下选择排序的原理。选择排序是不是每次找最小的元素放到前面?对,就是遍历数组,找到最小的,然后和当前位置交换。
那字符串的话,应该用二维字符数组来存储吧,比如char str[10][100],这样每个字符串最多99个字符加一个结束符。然后输入的话,用gets函数,不过要注意gets不安全,可能会有缓冲区溢出,但用户指定了要用,所以暂时不管这个。输出用puts,没问题。
接下来是排序部分。选择排序需要两层循环,外层循环控制当前要填充的位置,内层循环找从当前位置到末尾的最小字符串。比较字符串的话要用strcmp函数,找到最小字符串的位置,然后交换这两个字符串的位置。
交换字符串的话,不能直接赋值,应该用strcpy函数,或者交换指针。不过这里因为是二维数组,所以需要用strcpy到一个临时数组中,然后交换。或者用strncpy,或者直接逐个字符交换。不过用strcpy可能更方便。
那具体步骤应该是这样的:首先输入10个字符串,用循环gets到str数组中。然后进行选择排序,外层循环i从0到8,内层循环j从i到9,找到最小的那个下标min_idx,然后交换str[i]和str[min_idx]的内容。每次比较用strcmp(str[j], str[min_idx]),如果结果小于0,就更新min_idx。
然后交换的时候,需要一个临时字符数组temp,用strcpy(temp, str[i]),然后strcpy(str[i], str[min_idx]),再strcpy(str[min_idx], temp)。这样就能完成交换。
最后输出的时候,循环用puts输出每个字符串。
那代码结构大概是这样的:
#include <stdio.h>
#include <string.h>
#define N 10
#define LEN 100
int main() {
char str[N][LEN];
int i, j, min_idx;
char temp[LEN];
// 输入
for(i=0; i<N; i++) {
gets(str[i]);
}
// 选择排序
for(i=0; i<N-1; i++) {
min_idx = i;
for(j=i+1; j<N; j++) {
if(strcmp(str[j], str[min_idx]) < 0) {
min_idx = j;
}
}
if(min_idx != i) {
strcpy(temp, str[i]);
strcpy(str[i], str[min_idx]);
strcpy(str[min_idx], temp);
}
}
// 输出
for(i=0; i<N; i++) {
puts(str[i]);
}
return 0;
}
不过要注意,gets函数已经被弃用了,可能会有警告,但用户要求使用。另外,要确保输入的字符串不超过LEN-1的长度,否则会溢出。不过题目里没有说明,可能用户是希望简单实现,所以暂时不考虑这个问题。
另外,测试的时候,可能需要输入10个字符串,比如按照字母顺序倒序输入,看排序是否正确。比如输入j、i、h...a,排序后应该变成a、b...j这样的顺序。
有没有哪里可以优化的地方?比如把交换部分用指针数组来代替,但用户要求使用二维数组,所以这样应该没问题。代码看起来应该符合要求,简洁易懂。</think>以下是使用C语言实现选择排序对10个字符串进行排序的代码:
```c
#include <stdio.h>
#include <string.h>
#define N 10
#define LEN 100
int main() {
char str[N][LEN]; // 存储10个字符串
int i, j, min_idx;
char temp[LEN]; // 临时交换缓冲区
// 输入字符串
printf("输入%d个字符串:\n", N);
for (i = 0; i < N; i++) {
gets(str[i]);
}
// 选择排序
for (i = 0; i < N-1; i++) {
min_idx = i;
for (j = i+1; j < N; j++) {
if (strcmp(str[j], str[min_idx]) < 0) {
min_idx = j;
}
}
// 交换字符串
if (min_idx != i) {
strcpy(temp, str[i]);
strcpy(str[i], str[min_idx]);
strcpy(str[min_idx], temp);
}
}
// 输出结果
printf("\n排序后:\n");
for (i = 0; i < N; i++) {
puts(str[i]);
}
return 0;
}
```
代码说明:
1. 使用二维数组`str[N][LEN]`存储字符串(N=10个字符串,每个最长LEN-1字符)
2. `gets()`用于接收输入(注意:实际开发中建议用更安全的`fgets()`)
3. 双重循环实现选择排序:
- 外层循环控制当前位置
- 内层循环查找最小字符串
- 使用`strcmp()`进行字符串比较
4. 使用`strcpy()`进行字符串交换
5. `puts()`用于输出排序结果
注意:若输入字符串超过`LEN-1`个字符会导致缓冲区溢出,实际开发中建议:
1. 使用`fgets(str[i], LEN, stdin)`替代`gets()`
2. 添加输入长度校验
3. 处理换行符残留问题
阅读全文
相关推荐












