如何读取含多行、空格的用户输入?现有scanf代码输出异常
解决scanf读取用户输入出现乱码的问题
看起来你遇到的“大量3/4分数”其实是未初始化数组的垃圾值,核心问题出在两个地方:数组没初始化,也没加字符串终止符。咱们一步步来修正:
问题分析
你的代码逻辑本身是能读取字符、空格和换行的(scanf("%c")不会跳过空白字符,这点没问题),但:
- 数组
user_input没有初始化,未被写入的内存区域是随机的垃圾数据,输出时就会显示成奇怪的符号 - 读取结束后没有手动添加字符串终止符
\0,当你把user_input当作字符串处理时,程序会一直读到内存里的垃圾值为止
修正后的代码
#include <stdio.h> int main() { // 初始化数组,所有元素默认设为'\0',避免未写入区域的垃圾值 char user_input[1000] = {0}; int i = 0; // 限制读取数量,留一个位置放终止符,防止数组越界 while (i < 999 && scanf("%c", &user_input[i]) == 1) { i++; } // 手动添加字符串终止符,确保是合法的C字符串 user_input[i] = '\0'; // 测试输出验证结果 printf("你输入的内容:\n%s", user_input); return 0; }
更严谨的替代方案(用getchar)
getchar()在处理EOF时更直观,因为它返回int类型,可以明确区分普通字符和EOF(Ctrl+D触发的结束信号):
#include <stdio.h> int main() { char user_input[1000] = {0}; int i = 0; int c; // 用int存getchar的返回值,区分EOF和字符 while (i < 999 && (c = getchar()) != EOF) { user_input[i] = (char)c; i++; } user_input[i] = '\0'; printf("你输入的内容:\n%s", user_input); return 0; }
关键改进点
- 初始化数组:
char user_input[1000] = {0}会把数组所有元素设为\0,即使没读满数组,剩下的位置也不会输出乱码 - 数组越界保护:
i < 999确保不会写满整个数组,留一个位置给终止符\0 - 手动添加终止符:不管有没有读满数组,最后都加上
\0,保证程序把它当作正常字符串处理
这样修改后,就能正确读取所有输入的字符、空格、换行,直到你按下Ctrl+D结束输入啦。
内容的提问来源于stack exchange,提问作者Zoey Malkov
相关产品推荐
相关产品推荐

