如何在C语言的单行中读取多个字符输入?
解决C语言单行读取多个字符时的换行符干扰问题
你的问题出在scanf("%c")的行为上:%c会读取输入缓冲区里的所有字符,包括换行符(\n)。当你输入一行BBBBBBBB并按下回车后,输入缓冲区里的内容是B B B B B B B B \n(8个B加一个换行符)。循环中每次读取一个字符,前8次读到B,第9次就会读到换行符,后续循环还会等待你继续输入。如果后续打印这些字符,换行符就会导致每个B单独占一行。
至于你尝试的%s格式符没效果,大概率是没正确验证读取结果——%s会自动跳过开头的空白字符,然后读取连续的非空白字符直到遇到空白(比如换行),它会自动在数组末尾加上字符串终止符\0。只要输入是连续的单行字符,%s是可以一次性读取整行有效内容的。
下面给你几种可行的解决方案:
方案1:用%c时跳过空白字符
在%c前加一个空格,让scanf自动跳过所有空白字符(空格、换行、制表符等),只读取非空白的目标字符:
#include<stdio.h> int main() { char arry[10]; for(int i=0;i<10;i++) { scanf(" %c", &arry[i]); // 格式符前的空格跳过空白 } // 验证读取结果 for(int i=0;i<10;i++) { printf("%c", arry[i]); } return 0; }
方案2:用%s一次性读取整行连续字符
如果输入是无空格的单行字符,%s是更高效的选择,记得限制读取长度避免缓冲区溢出:
#include<stdio.h> int main() { char arry[10]; scanf("%9s", arry); // %9s限制最多读9个字符,留位置存终止符\0 printf("%s\n", arry); return 0; }
这段代码会一次性读取你输入的所有连续B,直到遇到换行符停止,打印出来就是整行的B。
方案3:用fgets安全读取整行
如果需要读取包含空格的整行,或者想要更安全的读取方式,推荐用fgets,它会读取包括换行符在内的整行内容:
#include<stdio.h> #include<string.h> // 用于strchr函数 int main() { char arry[10]; fgets(arry, sizeof(arry), stdin); // 读取整行,最多9个字符加终止符 // 可选:去掉末尾的换行符 char* newline = strchr(arry, '\n'); if (newline != NULL) { *newline = '\0'; } printf("%s\n", arry); return 0; }
内容的提问来源于stack exchange,提问作者Abhinav Gangwar
相关产品推荐
相关产品推荐

