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

如何使用scanf简便实现多个带空格字符串的输入输出?

原因说明

你现有代码只能读取第一个单词的核心原因是:scanf的%s格式符默认以任意空白字符(空格、换行、制表符等)作为读取终止标记,遇到空格就会停止读取,自然只能拿到第一个空格前的内容。同时常规单条单变量的写法确实不适合批量输入场景。

最简解决方案

使用%[^\n]格式符配合循环实现批量读取带空格的内容,无需重复编写上百个格式符与变量匹配项。
%[^\n]是scanf的扫描集用法,含义为读取所有字符直到遇到换行符为止,可以完整读取包含空格的整行内容。

示例代码(支持批量读取100条带空格内容)

#include <stdio.h>
// 可自由调整最大输入条数、单条内容最大长度
#define MAX_INPUT_COUNT 100
#define MAX_CONTENT_LEN 20

int main()
{
    // 二维数组存储所有输入内容
    char input_content[MAX_INPUT_COUNT][MAX_CONTENT_LEN];
    int i;

    // 循环读取100条内容,仅需3行代码即可完成批量输入,无需重复定义变量、写格式符
    for (i = 0; i < MAX_INPUT_COUNT; i++) {
        // 格式符前加空格:跳过上一次输入残留的换行符;加长度限制19避免缓冲区溢出
        scanf(" %19[^\n]", input_content[i]);
    }

    // 批量输出验证
    for (i = 0; i < MAX_INPUT_COUNT; i++) {
        printf("第%d条输入:%s\n", i + 1, input_content[i]);
    }

    return 0;
}
注意事项
  • 格式符前的空格不可省略:作用是跳过输入缓冲区中残留的空白字符,避免第一次输入后的后续读取直接拿到空内容。
  • 必须加长度限制:示例中%19[^\n]的19对应数组长度20,预留1位存储字符串结束符\0,避免输入过长触发缓冲区溢出漏洞。
  • 若更偏好安全的行读取方案,可替换为fgets(input_content[i], MAX_CONTENT_LEN, stdin),该函数原生支持读取整行带空格内容,无需额外处理格式符,仅需注意fgets会将行尾的换行符也存入数组,不需要的话可手动清除。

内容的提问来源于stack exchange,提问作者DacaDa Apasati-TastAunu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:03:03