C语言使用strcmp实现字符串字典排序的代码问题求助
问题分析
- 输入逻辑错误:
scanf("%s[^\n]", a_word[i])是非法格式串,%s和%[^\n]不能混用,若不需要读取带空格的字符串直接用%s即可,同时要限制读取长度避免数组越界。 - 变量未初始化:
index变量声明后未赋值就直接在while循环中判断,会产生未定义行为。 - 排序逻辑完全失效:现有逻辑既没有实现排序所需的元素交换,也没有遍历所有元素完成排序流程,最后仅输出1个字符串,不符合输出10个排序后字符串的要求。
strcmp返回值判断错误:strcmp仅保证返回值小于0、等于0、大于0三种情况,不会固定返回-1,判断前者字典序小于后者应该用返回值<0的条件。- 输出语法错误:
printf("%s",&a_word[i])中参数类型不匹配,a_word[i]本身就是字符串首地址,不需要加取地址符&。
修正后可运行代码
#include <stdio.h> #include <string.h> int main() { int i, j; char a_word[10][11]; // 多留1位存字符串结束符'\0' char temp[11]; // 交换用的临时数组 printf("请输入10个字符串:\n"); for (i = 0; i < 10; i++) { // 限制读取长度为10,防止越界 scanf("%10s", a_word[i]); } // 冒泡排序实现字典序排序 for (i = 0; i < 9; i++) { for (j = 0; j < 9 - i; j++) { // 前一个字符串比后一个大就交换 if (strcmp(a_word[j], a_word[j+1]) > 0) { strcpy(temp, a_word[j]); strcpy(a_word[j], a_word[j+1]); strcpy(a_word[j+1], temp); } } } printf("\n排序后结果:\n"); for (i = 0; i < 10; i++) { printf("%s\n", a_word[i]); } return 0; }
代码说明
- 数组长度设置为11,预留1个字节存储字符串结束符
\0,避免输入长度为10的字符串时出现越界。 - 用
%10s限制输入长度,防止缓冲区溢出。 - 采用冒泡排序逻辑,通过
strcmp比较相邻字符串的字典序,若顺序错误就用strcpy完成字符串交换。 - 排序完成后遍历数组输出所有10个排序后的字符串。
内容的提问来源于stack exchange,提问作者Yesmale4
相关产品推荐
相关产品推荐

