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
相关产品推荐
相关产品推荐

