C语言中输入多词时首个scanf_s跳过第二个的问题咨询
问题原因分析
首先得搞清楚为啥会出现这个问题:scanf_s("%s") 是以空白字符(空格、回车、制表符)作为输入结束的标志。当你输入 John Cena 时,第一个 scanf_s 只会读取到 John,剩下的 Cena 和换行符 \n 会留在输入缓冲区里。接下来第二个 scanf_s("%s") 执行时,会直接读取缓冲区里的 Cena,根本不会等你输入IC/护照信息,看起来就像是被跳过了。
解决方案
下面给你几种可行的解决办法,你可以根据需求选择:
方法1:使用 fgets 读取整行输入,再配合 sscanf_s 处理
fgets 可以读取整行输入(包括空格),直到遇到换行符为止,这样就能完整获取用户输入的姓名(比如 John Cena)。之后如果需要格式化处理,可以用 sscanf_s 提取内容。注意要处理掉fgets读取到的换行符。
示例代码:
#include <stdio.h> #include <string.h> void main() { char name[64], identity[64]; printf("Welcome to ABC Computer Store!\n"); printf("Please enter your name: "); // 读取整行姓名,包括空格 fgets(name, sizeof(name), stdin); // 去掉fgets读取到的换行符(如果存在) size_t len = strlen(name); if (len > 0 && name[len-1] == '\n') { name[len-1] = '\0'; } printf("Please enter your IC/Passport: "); fgets(identity, sizeof(identity), stdin); len = strlen(identity); if (len > 0 && identity[len-1] == '\n') { identity[len-1] = '\0'; } // 测试输出 printf("Name: %s\n", name); printf("IC/Passport: %s\n", identity); }
方法2:使用 scanf_s 的 %[^\n] 格式说明符
%[^\n] 表示读取所有字符,直到遇到换行符 \n 为止,这样就能读取带空格的字符串。但要注意:
- 必须加上宽度限制(比如
%62[^\n],因为数组大小是64,要留一个位置给终止符\0) - 第一个
scanf_s执行后,缓冲区里会留下换行符,需要先清空缓冲区,否则第二个scanf_s会读到空内容。
示例代码:
#include <stdio.h> void main() { char name[64], identity[64]; printf("Welcome to ABC Computer Store!\n"); printf("Please enter your name: "); // 读取所有字符直到换行,最多62个(留一个给\0) scanf_s("%62[^\n]", name, sizeof(name)); // 清空输入缓冲区里的换行符 int c; while ((c = getchar()) != '\n' && c != EOF); printf("Please enter your IC/Passport: "); scanf_s("%62[^\n]", identity, sizeof(identity)); // 测试输出 printf("Name: %s\n", name); printf("IC/Passport: %s\n", identity); }
注意事项
- 不管用哪种方法,都要注意数组的边界,避免缓冲区溢出。比如
fgets和scanf_s都要指定最大读取长度,不能超过数组的大小。 - 如果用户输入的内容超过数组长度,两种方法都会截断多余的字符,你可以根据需求添加输入长度的检查逻辑。
内容的提问来源于stack exchange,提问作者Lucas Chan
相关产品推荐
相关产品推荐

