如何使用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
相关产品推荐
相关产品推荐

