You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

scanf读取字符串时被跳过,如何按顺序读取int、含空格字符串与int?

问题原因

你遇到的问题根源是输入缓冲区残留的换行符:

  • 用scanf("%d", &L)读取整数时,输入完数字按下的回车(\n)会留在输入缓冲区中。
  • 后续调用scanf("%s", lin)时,%s会自动跳过空白字符(包括换行),但它只能读取到第一个空格就停止,根本无法读取带空格的字符串;而用fgets的话,它会直接把缓冲区里残留的换行符读进lin,导致你看到lin首字符是\n。
解决方法

要按顺序读取int、带空格的字符串、int,需要分三步处理:

  1. 读取第一个整数后,清空输入缓冲区里的残留换行符。
  2. 用fgets读取带空格的整行字符串(fgets会读取包括空格在内的所有字符,直到换行或达到缓冲区上限)。
  3. 读取第二个整数时,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,提问作者ステキな色

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:55:33