深度正文
c 语言中怎么连续输入几个字符串,主流方案是定义字符数组(二维字符数组),配合循环调用 scanf 的 % s 格式符连续读取,也可以使用 gets 或者 fgets 读取带空格的字符串。核心要点是 % s 默认遇到空格回车就停止读取,如果需要字符串内部包含空格,就不能继续使用 % s,要换成 fgets。同时要注意输入缓冲区回车残留、数组越界这两个高频坑点,这也是考试编程题常考内容。
两种常用方案对照表
| 方案 | 读取特点 | 适用场景 |
|---|---|---|
| 循环 + scanf % s | 遇到空格回车就结束读取,不能读带空格字符串 | 每个字符串不含空格,连续录入多个单词 |
| 循环 + fgets | 可以读取包含空格的整行字符串,回车作为一行结束 | 需要输入带空格的整句字符串 |
方案一 二维字符数组 + 循环 scanf
1 定义二维字符数组,第一维代表字符串个数,第二维代表单个字符串最大长度,例如 char str [5][20],代表一共 5 个字符串,每个最多 19 个有效字符,预留位置存放结束标记 \0
2 写 for 循环,循环变量 i 从 0 到字符串总数减 1
3 循环内部使用 scanf ("% s", str [i]),注意 str [i] 本身就是首地址,不需要再加取地址符 &
4 用户每输入一个字符串按回车,循环继续读取下一个
5 全部读取完成之后,可以循环输出所有字符串验证结果
方案二 循环 + fgets 读取整行带空格字符串
1 同样定义二维字符数组 char str [5][100]
2 for 循环内调用 fgets (str [i], 100, stdin)
3 fgets 会把用户按下的回车字符也存入数组,后续处理如果不需要换行符,可以手动把末尾 \n 替换成 \0
4 该方式支持字符串中间有空格,适合句子类输入
深度核心要点
第一 二维数组第一维是字符串数量,第二维一定要预留 \0 位置,c 语言字符串必须以 \0 作为结束标记,长度设置过小会发生数组越界。
第二 scanf 的 % s 不读取空格,如果输入内容中间有空格,会被识别成多个独立字符串,这是最容易混淆的地方。
第三 缓冲区残留问题,如果前面有读取 char 字符的 scanf,回车会留在输入缓冲区,下一次 fgets 会直接读到空行,一般可以用 getchar () 消耗残留回车。
第四 也可以定义一维指针数组 char str [5],但是需要提前分配内存,基础考试题目优先使用二维字符数组写法。
第五 不推荐旧版 gets 函数,gets 不做长度校验,存在缓冲区溢出风险,新标准已经移除。
常见错误汇总
错误 1 scanf 读取字符串额外添加 &,写成 scanf ("% s",&str [i]),基础题一般报错或者异常
错误 2 第二维长度太小,输入过长导致越界
错误 3 想用 % s 读取带空格句子,发现只读到空格前面一部分
错误 4 使用 gets 函数,编译器提示不安全
错误 5 忘记字符串结尾 \0,后续字符串处理函数 strcmp strcpy 读取越界
综合来说,c 语言中怎么连续输入几个字符串,无空格字符串优先二维数组加循环 scanf % s,带空格整行字符串改用循环 fgets,记住二维数组结构,区分 % s 和 fgets 读取规则,处理好缓冲区残留回车。
相关 FAQ
问题 1 c 语言中怎么连续输入几个字符串,% s 可以读取空格吗
回答 1 c 语言中怎么连续输入几个字符串,scanf 的 % s 遇到空格就停止读取,不能读取包含空格的字符串,c 语言中怎么连续输入几个字符串如果需要带空格整行,改用 fgets。
问题 2 c 语言中怎么连续输入几个字符串,二维数组 str [i] 要不要加 &
回答 1 c 语言中怎么连续输入几个字符串,str [i] 本身就是该行首地址,不需要再加 &,c 语言中怎么连续输入几个字符串这一点和普通 int 变量 scanf 需要 & 不一样。
问题 3 c 语言中怎么连续输入几个字符串,为什么不推荐 gets
回答 1 c 语言中怎么连续输入几个字符串,gets 不会限制输入长度,容易缓冲区溢出,已经从标准移除,c 语言中怎么连续输入几个字符串推荐使用 fgets 替代 gets。
免责声明
本文内容仅作为 c 语言编程基础知识科普,不同编译器输入处理细节存在细微差异,实际开发请参考对应 c 标准与编译器官方文档,本文不构成工程开发方案推荐。


