字符串冒泡排序代码异常:移除printf后无输出及排序错误排查
字符串冒泡排序的问题排查与修复
遇到的问题
- 移除
bubblesort函数内注释的printf语句后,程序输入完成后无任何输出 - 保留该
printf语句时,排序结果为降序,不符合预期的升序要求
原代码
#include <stdio.h> #include <string.h> void bubblesort(int n, char *ptr[]){ char *tmp; for (int i = 0; i < n; i++){ for (int j = 0 ; j < n; j++){ if(strcmp(*(ptr+i) , *(ptr+j))>0){ strcpy(tmp , *(ptr+i)); strcpy(*(ptr+i) , *(ptr+j)); strcpy(*(ptr+j) , tmp); } } } //printf("",ptr+0,ptr+1,ptr+2,ptr+3,ptr+4,ptr+5,ptr+6,ptr+7,ptr+8,ptr+9); <= without this line my code doesn't executive } int main() { int n; scanf("%d\n", &n); char str[10][20]; for (int i = 0; i < n; i++) gets(str[i]); char *ptr[10]; for (int i = 0; i < n; i++) ptr[i] = str[i]; bubblesort(n, ptr); for (int i = 0; i < n; i++) puts(ptr[i]); }
运行结果
保留printf语句时
C:\Users\kk\Desktop\C>a 10 banana kiwi apple tomato lemon melon pear blueberry strawberry orange tomato strawberry pear orange melon lemon kiwi blueberry banana apple C:\Users\kk\Desktop\C>
移除printf语句时
C:\Users\kk\Desktop\C>a 10 banana kiwi apple tomato lemon melon pear blueberry strawberry orange C:\Users\kk\Desktop\C>
错误原因分析
无输出的核心原因:未初始化指针
tmptmp是未初始化的char*指针,没有指向有效内存空间。直接用strcpy(tmp, ...)会往随机内存地址写入数据,触发未定义行为——保留printf时只是巧合让程序没立即崩溃,移除后内存错误直接导致程序提前终止,因此无输出。排序降序的原因:冒泡排序逻辑错误
- 双重循环范围错误:
j从0遍历到n-1,会重复比较已排好的元素,且每次把更大的元素交换到前面,最终形成降序。 - 比较逻辑问题:正确的升序冒泡排序应该让相邻元素比较,把大元素逐步“冒”到后面,而非全局比较所有元素对。
- 双重循环范围错误:
额外输入问题
scanf("%d\n", &n)中的\n会让scanf持续等待非空白字符,导致输入流程异常;gets函数不安全,易造成缓冲区溢出,需替换为更安全的输入函数。
修复后的代码
#include <stdio.h> #include <string.h> void bubblesort(int n, char *ptr[]){ // 直接交换指针,避免字符串拷贝的内存风险,同时提升效率 char *tmp; for (int i = 0; i < n - 1; i++){ // 每轮循环后,最后i个元素已是最大值,无需再比较 for (int j = 0 ; j < n - i - 1; j++){ // strcmp返回>0表示ptr[j] > ptr[j+1],交换后实现升序 if(strcmp(ptr[j], ptr[j+1]) > 0){ tmp = ptr[j]; ptr[j] = ptr[j+1]; ptr[j+1] = tmp; } } } } int main() { int n; // 去掉格式串中的\n,避免输入阻塞 scanf("%d", &n); // 吃掉scanf留下的换行符,防止fgets读取空行 getchar(); char str[10][20]; for (int i = 0; i < n; i++){ // 用fgets替代gets,同时截断换行符 fgets(str[i], sizeof(str[i]), stdin); str[strcspn(str[i], "\n")] = '\0'; } char *ptr[10]; for (int i = 0; i < n; i++) ptr[i] = str[i]; bubblesort(n, ptr); for (int i = 0; i < n; i++) puts(ptr[i]); }
修复说明
- 指针交换替代字符串拷贝:彻底避免未初始化指针的内存风险,同时提升排序效率;
- 排序逻辑修正:调整循环范围为
j < n - i - 1,仅比较相邻元素,通过strcmp判断实现升序; - 输入问题修复:移除
scanf的\n,用getchar()处理残留换行,替换gets为fgets并截断换行符,避免输入异常。
内容的提问来源于stack exchange,提问作者kitewatermelon
相关产品推荐
相关产品推荐

