使用scanf存储char数组后排序无输出,求排查scanf与printf用法问题
字符数组按ASCII码排序的输入输出问题解决
问题描述
需要将类似ANF23ie89Z的字符数组按ASCII码排序后输出为2389AFNZei,尝试的代码运行后无输出,核心问题在于scanf和printf的使用错误。
原代码
#include <iostream> #include <stdio.h> using namespace std; int main(){ char arr[20]; for(int i = 0; i < 20; i++){ scanf(“%s”, &arr[i]); getchar(); } for(int i = 0; i < 20; i++){ for(int j = 0; j < 20 - i - 1; j++){ if(arr[j] > arr[j+1]){ int tmp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = tmp; } } } for(int i = 0; i < 20; i++){ printf(“%s”, arr[i]); } puts(“”); return 0; }
核心错误分析
scanf("%s", &arr[i])错误:%s是读取字符串的格式符,它会把输入内容(含自动添加的\0结束符)从&arr[i]开始写入内存,直接造成数组越界,完全不符合你“逐个存储单个字符”的需求。读取单个字符应该用%c格式符。printf("%s", arr[i])错误:%s要求传入字符串首地址(char*类型),但arr[i]是单个char变量,传入后会被当作地址处理,导致输出错误甚至无输出。输出单个字符应该用%c格式符。- 输入循环逻辑混乱:循环强制要求输入20个字符,但你的目标是处理连续字符串,且
getchar()会吃掉换行/空格,导致输入流程异常。 - 排序包含无效垃圾值:数组未赋值的位置是随机垃圾值,直接对整个20长度数组排序会把这些无效值也纳入,输出结果混乱。
修正后的代码
#include <iostream> #include <stdio.h> using namespace std; int main(){ char arr[20]; int len = 0; // 记录实际输入的字符长度 // 直接读取整个字符串到数组,自动添加结束符\0 scanf("%s", arr); // 计算实际有效字符长度 while(arr[len] != '\0'){ len++; } // 仅对有效字符进行冒泡排序 for(int i = 0; i < len; i++){ for(int j = 0; j < len - i - 1; j++){ if(arr[j] > arr[j+1]){ char tmp = arr[j]; // 用char类型存临时值更匹配 arr[j] = arr[j+1]; arr[j+1] = tmp; } } } // 逐个输出有效字符 for(int i = 0; i < len; i++){ printf("%c", arr[i]); } puts(""); return 0; }
关键修改说明
- 输入优化:用
scanf("%s", arr)直接读取连续字符串,arr本身就是数组首地址,无需取址符&,系统自动添加\0标记字符串结束。 - 有效长度计算:通过循环找到
\0位置,得到实际输入字符数,避免排序垃圾值。 - 排序范围限制:冒泡排序的循环次数基于实际长度
len,只处理输入的有效字符。 - 输出格式修正:用
%c格式符逐个输出单个字符,匹配需求。 - 临时变量类型调整:交换字符用
char类型,避免不必要的类型转换。
内容的提问来源于stack exchange,提问作者Oyasumi
相关产品推荐
相关产品推荐

