使用冒泡排序对字符串排序时仅输出单个字符串的问题排查
字符串冒泡排序输出异常问题修复
我在用冒泡排序对字符串排序时,发现输出只显示一个字符串,其余内容为空。以下是我的代码及控制台输入输出情况:
原代码
int main(int argc, char **argv) { int numberOfStrings, remaining; printf("Input number of strings:"); scanf("%d", &numberOfStrings); // equalizing remaining check count for bubble sort algorithm remaining = numberOfStrings - 1; // strCount - 1 is adequate for bubble sort element count char strings[numberOfStrings][50], temp[50]; int count = 0, cmp; printf("Input string %d:", numberOfStrings); for (int i = 0; i < numberOfStrings; i++) scanf("%s", strings); while (remaining != 0) { // bubble sort cmp = strncmp(strings[count], strings[count+1], sizeof(strings[count]-1)); if (cmp > 0) { strncpy(temp, strings[count], sizeof(temp)-1); strncpy(strings[count], strings[count+1], sizeof(strings[count]-1)); strncpy(strings[count+1], temp, sizeof(temp)-1); } count++; --remaining; } printf("\n--------------------------------------------\n"); for(int i = 0; i < numberOfStrings; i++) printf("%s\n", strings[i]); return 0; }
控制台输入输出
Input number of strings:3 Input string 3:ddddddddddd vvvvvvvvvvv bbbbbbbbbb -------------------------------------------- bbbbbbbbbb □□
问题分析与修复
代码存在几个关键错误导致输出异常:
1. 字符串输入索引错误
输入循环中scanf("%s", strings);未指定数组索引,每次输入都会覆盖strings[0],导致后续数组位置始终为空。
修复:改为scanf("%s", strings[i]);,将每个输入字符串存入对应数组位置。
2. 冒泡排序逻辑不完整
原代码仅执行一轮相邻元素比较,而冒泡排序需要多轮遍历(最多numberOfStrings-1轮)才能完成排序。同时原逻辑会出现数组越界问题:当count增长到numberOfStrings-1时,count+1超出数组范围,引发未定义行为。
修复:改用双层循环实现标准冒泡排序,外层控制遍历轮数,内层负责每一轮的相邻元素比较交换。
3. strncmp与strncpy参数错误
sizeof(strings[count]-1)是错误写法,实际计算的是指针运算后的大小,正确应为sizeof(strings[count]) - 1,确保操作的字符数不超过数组容量,避免溢出。
4. 输入提示信息错误
原代码固定显示总字符串数,应在输入循环中动态提示当前输入的是第几个字符串,提升交互合理性。
修复:改为printf("Input string %d:", i+1);。
修复后的代码
#include <stdio.h> #include <string.h> int main(int argc, char **argv) { int numberOfStrings; printf("Input number of strings:"); scanf("%d", &numberOfStrings); char strings[numberOfStrings][50], temp[50]; // 修复输入提示与索引问题 for (int i = 0; i < numberOfStrings; i++) { printf("Input string %d:", i + 1); scanf("%s", strings[i]); } // 标准冒泡排序实现 for (int i = 0; i < numberOfStrings - 1; i++) { for (int j = 0; j < numberOfStrings - i - 1; j++) { // 修复strncmp参数 int cmp = strncmp(strings[j], strings[j+1], sizeof(strings[j]) - 1); if (cmp > 0) { // 修复strncpy参数,手动添加终止符避免异常 strncpy(temp, strings[j], sizeof(temp) - 1); temp[sizeof(temp)-1] = '\0'; strncpy(strings[j], strings[j+1], sizeof(strings[j]) - 1); strings[j][sizeof(strings[j])-1] = '\0'; strncpy(strings[j+1], temp, sizeof(strings[j+1]) - 1); strings[j+1][sizeof(strings[j+1])-1] = '\0'; } } } printf("\n--------------------------------------------\n"); for(int i = 0; i < numberOfStrings; i++) printf("%s\n", strings[i]); return 0; }
说明
修复后的代码会正确读取所有输入字符串,通过标准冒泡排序完成字典序排序,输出所有排序后的结果。额外添加了字符串终止符的手动设置,避免strncpy在复制满长度时缺少终止符导致的输出异常。
内容的提问来源于stack exchange,提问作者mustafalinan
相关产品推荐
相关产品推荐

