为何scanf()在字符串反转程序中忽略空格后的内容?
为什么scanf("%s")会忽略空格后的内容?
核心原因
scanf("%s")的设计逻辑就是以空白字符(空格、换行、制表符等)作为输入的终止标志。它只会读取从当前位置开始到第一个空白字符之前的所有非空白字符,并存入目标字符串数组,空白字符本身会被留在输入缓冲区中,不会被读取。
对应你的场景:输入123 325时,scanf("%s")读取到第一个空格就停止,仅将"123"存入given数组,后面的" 325"完全没被处理,所以反转后自然只输出321。
解决办法
如果需要读取包含空格的整行输入,推荐用以下两种方式:
- 使用
fgets()读取整行fgets()会读取直到换行符(包括换行符)的整行内容,更适合处理带空格的输入:
#include <stdio.h> #include <string.h> int main() { int i; char given[30]; char reversed[30]; printf("enter your string\n"); // 读取整行输入,最多读取sizeof(given)-1个字符 fgets(given, sizeof(given), stdin); // 去掉fgets读入的换行符(如果存在) given[strcspn(given, "\n")] = '\0'; int len = strlen(given); for (i = 0; i < len; i++) { reversed[i] = given[len - 1 - i]; } reversed[len] = '\0'; // 手动添加字符串终止符 printf("%s\n", reversed); return 0; }
- 使用
scanf的%[^\n]格式符
该格式符表示读取所有非换行符的字符,注意要指定最大长度避免缓冲区溢出:
scanf("%29[^\n]", given); // 29是因为given数组长度为30,留1位存'\0'
不过这种方式需要注意:如果输入缓冲区之前有残留的换行符(比如上一次输入留下的),会直接读取到空字符串,需要先清理缓冲区。
原代码的小优化点
- 原代码中
printf("enter your stringn");少了换行符,应该改为printf("enter your string\n");,否则提示文字不会换行。 - 反转字符串的循环可以简化:先获取字符串长度
len = strlen(given),循环i从0到len-1赋值,最后手动给reversed[len]赋值'\0',逻辑更清晰。
内容的提问来源于stack exchange,提问作者Madhav bhardwaj
相关产品推荐
相关产品推荐

