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

C语言字符串字典序排序程序输入提示异常问题排查求助

问题分析与修复方案

首先,你的程序出现enter the string1enter the string2连续显示的问题,主要有两个核心错误:

1. scanf遗留的换行符被fgets读取

当你用scanf("%d",&n)读取用户输入的数字时,用户输入数字后会按下回车,这个回车对应的换行符\n会留在输入缓冲区中。接下来第一个fgets(a[i],sizeof(a[i]),stdin)会直接读取这个换行符,相当于第一个字符串被“空输入”占用了,所以程序会直接进入下一次循环,把enter the string2的提示紧接着打出来,就出现了连续显示的情况。

2. 数组索引越界(未定义行为)

C语言的数组下标是从0开始的,但你的循环里从i=1开始到i<=n,这会访问a[1]到a[n],而a数组的有效下标范围是0到n-1,a[n]属于越界访问,会触发未定义行为(可能导致程序崩溃或者数据错乱)。


修正后的完整代码

// Program to print sentences in lexicographical order
#include<stdio.h>
#include<string.h>

int main() {
    int n, i, j;
    // 先读取n再定义数组(C99及以上支持变长数组)
    printf("Enter the number of strings: ");
    scanf("%d", &n);
    // 读取完n后,清空输入缓冲区的换行符
    getchar();

    char a[n][20], temp[20];

    // 循环从0开始,到n-1结束
    for(i = 0; i < n; i++) {
        printf("Enter string %d: ", i+1);
        fgets(a[i], sizeof(a[i]), stdin);
        // 去掉fgets读取到的换行符(可选,避免排序时换行符影响)
        a[i][strcspn(a[i], "\n")] = '\0';
    }

    // 冒泡排序,同样用0-based索引
    for(i = 0; i < n-1; i++) {
        for(j = i+1; j < n; j++) {
            if(strcmp(a[i], a[j]) > 0) {
                strcpy(temp, a[i]);
                strcpy(a[i], a[j]);
                strcpy(a[j], temp);
            }
        }
    }

    printf("\nIn lexicographical order:\n");
    for(i = 0; i < n; i++) {
        puts(a[i]);
    }

    return 0;
}

关键修改说明

  • 清空输入缓冲区:在scanf后调用getchar(),把残留的换行符吃掉,这样后续的fgets就能正常读取用户输入的字符串了。
  • 改为0-based数组索引:所有循环都从0开始,避免越界访问,符合C语言数组的使用规范。
  • 可选优化:用strcspn去掉fgets读取到的换行符,因为fgets会把用户输入的回车也读进字符串里,可能影响排序结果(比如两个字符串内容相同但一个带换行符,排序时会有差异)。
  • 提示信息优化:给提示加了冒号和空格,输入体验更友好。

测试运行后,输入提示会正常单独显示,排序结果也正确。

内容的提问来源于stack exchange,提问作者rajasekar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:02:42