You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:06:03