如何编写一个程序来接收由空格分隔的五个非空短字符串(每个字符串长度小于80且不含空白字符),然后按照字典序从小到大排序并输出这五个字符串?
时间: 2025-06-02 16:36:32 浏览: 13
要编写一个程序来完成这个任务,你可以使用以下步骤:
1. 首先,定义一个结构体来存储这些字符串及其索引,因为我们需要根据它们的顺序进行排序。
2. 创建一个动态数组或链表来保存结构体,这样可以根据需要添加或删除元素。
3. 接收用户输入的五个字符串,检查是否符合要求(非空、长度小于80且无空白)。
4. 将输入的字符串插入结构体数组,并保持字典序。
5. 对结构体数组进行排序,这里我们可以使用C标准库中的`qsort`函数,但需要注意传递比较函数。
6. 输出排序后的字符串。
以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义结构体,包含字符串和索引
typedef struct {
char* str;
int index;
} StringStruct;
// 比较函数,用于qsort
int compare(const void* a, const void* b) {
return strcmp(((StringStruct*)a)->str, ((StringStruct*)b)->str);
}
void insert(StringStruct** arr, char* str, int size) {
if (size == 5) {
printf("已达最大数量,无法再添加。\n");
return;
}
for (int i = 0; i < size; ++i) {
if (!strcmp(arr[i]->str, "")) { // 如果找到空位置,则插入新字符串
strcpy(arr[i]->str, str);
return;
}
}
// 如果已满,创建新的数组并复制旧数组
StringStruct* new_arr = realloc(arr, sizeof(StringStruct) * (size + 1));
if (new_arr == NULL) {
perror("Memory allocation failed.");
exit(1);
}
arr = new_arr;
strcpy(arr[size].str, str);
arr[size].index = size;
size++;
}
void print_sorted(StringStruct* arr, int size) {
for (int i = 0; i < size; ++i) {
printf("%d. %s\n", arr[i].index + 1, arr[i].str);
}
}
int main() {
StringStruct* arr = malloc(sizeof(StringStruct) * 5); // 初始化数组
for (int i = 0; i < 5; ++i) {
char input[81];
fgets(input, 81, stdin);
// 去除换行符
input[strcspn(input, "\n")] = '\0';
// 检查输入有效性
if (strlen(input) >= 1 && strlen(input) < 80 && !isspace(input[0])) {
insert(arr, input, i);
} else {
printf("Invalid input: '%s'.\n", input);
}
}
qsort(arr, 5, sizeof(StringStruct), compare);
print_sorted(arr, 5);
free(arr);
return 0;
}
```
阅读全文