scanf读取字符串时被跳过,如何按顺序读取int、含空格字符串与int?
问题原因
你遇到的问题根源是输入缓冲区残留的换行符:
- 用
scanf("%d", &L)读取整数时,输入完数字按下的回车(\n)会留在输入缓冲区中。 - 后续调用
scanf("%s", lin)时,%s会自动跳过空白字符(包括换行),但它只能读取到第一个空格就停止,根本无法读取带空格的字符串;而用fgets的话,它会直接把缓冲区里残留的换行符读进lin,导致你看到lin首字符是\n。
解决方法
要按顺序读取int、带空格的字符串、int,需要分三步处理:
- 读取第一个整数后,清空输入缓冲区里的残留换行符。
- 用
fgets读取带空格的整行字符串(fgets会读取包括空格在内的所有字符,直到换行或达到缓冲区上限)。 - 读取第二个整数时,
scanf的%d格式会自动跳过空白字符,无需额外处理。
下面是修正后的代码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() { int L, X; char lin[25] = {0}; // 读取第一个整数 scanf("%d", &L); // 清空缓冲区里的换行符及多余字符 while (getchar() != '\n'); // 读取带空格的整行字符串 fgets(lin, sizeof(lin), stdin); // 去掉fgets读取到的换行符(如果存在) lin[strcspn(lin, "\n")] = '\0'; // 读取第二个整数 scanf("%d", &X); // 测试输出(可根据需求删除) printf("L = %d\n", L); printf("lin = %s\n", lin); printf("X = %d\n", X); return 0; }
补充说明
while(getchar() != '\n');:循环读取缓冲区里的字符直到换行,确保缓冲区干净,避免残留字符干扰后续输入。strcspn(lin, "\n"):返回lin中第一个\n的位置,将该位置设为\0,即可去掉fgets附带的换行符,避免字符串末尾多出换行。
内容的提问来源于stack exchange,提问作者ステキな色
相关产品推荐
相关产品推荐

