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

C语言如何将带空格的多单词字符串传入函数并正常打印

问题根因

  • 代码中使用的scanf("%s", string)默认以空白符(空格、换行、制表符等)作为输入分隔符,碰到空格就会停止读取,因此只能获取第一个单词的内容
  • printer函数中循环次数硬编码为51次,而定义的全局字符数组长度仅为11,会触发数组越界访问,属于C语言中的未定义行为
  • 全局字符串变量无存在必要,可直接在main函数内部作为局部变量声明使用

修复方案

  1. 把scanf替换为fgets函数,fgets可以读取包含空格的整行输入,且可以指定读取长度避免缓冲区溢出
  2. 修改printer函数的逻辑,改为判断字符串结束符\0来终止遍历,不要硬编码循环次数
  3. 调整字符数组长度到合理范围,避免输入内容放不下

修复后的完整代码

#include <stdio.h>
#include <string.h>

// 字符串打印函数
void printer(char *words);

int main(){
    // 定义长度为100的字符数组,足够存储普通长度的输入
    char string[100];
    // 用fgets读取整行输入,包含空格
    // 三个参数分别为:存储数组、最大读取长度、输入流(stdin代表标准输入)
    fgets(string, sizeof(string), stdin);
    // 去掉fgets读取到的末尾换行符
    string[strcspn(string, "\n")] = '\0';
    
    printer(string);
    return 0;
}

void printer(char *words) {
    // 遍历到字符串结束符\0就停止,不会越界
    for (int i = 0; words[i] != '\0'; i++) {
        printf("%c", words[i]);
    }
    // 打印换行优化输出效果
    printf("\n");
}

核心改动说明

  • 使用fgets替换scanf("%s"):支持读取带空格的整行输入,同时通过指定读取长度避免缓冲区溢出风险
  • 遍历逻辑优化:通过判断字符串结束符\0控制循环终止,适配任意合法长度的字符串输入,也避免了数组越界问题
  • 移除无必要的全局变量:将字符串数组改为main函数内的局部变量,逻辑更清晰

内容的提问来源于stack exchange,提问作者Wiazarr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:09:03