C语言如何将带空格的多单词字符串传入函数并正常打印
问题根因
- 代码中使用的
scanf("%s", string)默认以空白符(空格、换行、制表符等)作为输入分隔符,碰到空格就会停止读取,因此只能获取第一个单词的内容 - printer函数中循环次数硬编码为51次,而定义的全局字符数组长度仅为11,会触发数组越界访问,属于C语言中的未定义行为
- 全局字符串变量无存在必要,可直接在main函数内部作为局部变量声明使用
修复方案
- 把
scanf替换为fgets函数,fgets可以读取包含空格的整行输入,且可以指定读取长度避免缓冲区溢出 - 修改printer函数的逻辑,改为判断字符串结束符
\0来终止遍历,不要硬编码循环次数 - 调整字符数组长度到合理范围,避免输入内容放不下
修复后的完整代码
#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
相关产品推荐
相关产品推荐

