在 C 语言里面输入字符串,主流可以使用 scanf gets fgets getchar 逐个读取这几种方式,不同函数对空格 回车 缓冲区 越界的处理差别很大,实际开发最推荐 fgets,因为它可以限制读取长度,能够避免数组溢出,scanf 写法最简单但是遇到空格就会停止读取,gets 已经被新标准废弃,因为没有长度限制存在严重缓冲区溢出风险。C 语言字符串本质是以空字符结尾的 char 数组,输入的时候除了读取用户输入字符,还必须保证末尾自动或者手动补上这个结束标记,否则后续打印和处理字符串会出现乱码。输入过程还要重点理解标准输入缓冲区,键盘敲入的内容不会立刻进入程序,是先存到缓冲区,按下回车之后,输入函数才会从缓冲区取数据,残留回车符很容易造成下一次输入异常。
一 各个输入函数核心对比
| 函数 | 是否支持空格 | 是否限制长度 | 是否保留回车 | 备注 |
|---|---|---|---|---|
| scanf%s | 不支持空格 | 可加宽度限制 | 不保留回车 | 遇到空格换行就停止读取 |
| gets | 支持空格 | 不支持长度限制 | 会去掉末尾回车 | C11 标准已经移除该函数 |
| fgets | 支持空格 | 支持最大长度 | 会保留回车 | 推荐首选,安全性高 |
| getchar 循环读取 | 支持空格 | 可自行控制 | 可自行处理回车 | 灵活可控,适合自定义读取逻辑 |
二 scanf 输入字符串写法
首先定义字符数组作为字符串存储空间,比如 char str [100],然后调用 scanf 配合 % s 格式符读取。
基础写法 scanf ("% s", str);
这个写法的特点是从输入开始读取,碰到空格 制表符 回车就停止,所以不能输入带空格的一句话。
安全改进写法 scanf ("%99s", str); 数字代表最多读取 99 个字符,预留最后一位存放字符串结束标记,防止数组越界。
注意事项,传入参数直接写数组名,不需要再加取地址符,因为数组名本身就是首地址。
三 fgets 输入字符串写法
函数原型 fgets (char str, int n, stdin);
第一个参数是字符数组,第二个参数是最大读取字符数量,第三个参数 stdin 代表从键盘标准输入读取。
执行逻辑,最多读取 n 减 1 个字符,自动追加字符串结束标记,如果用户输入长度小于 n,按下回车之后,会把回车换行符一起读进数组里面。
示例 char str [100]; fgets (str,100,stdin);
如果需要去掉读进来的换行符,可以遍历数组找到换行符位置,替换成空字符,这是 fgets 非常常见的配套处理。
四 gets 函数说明
基础写法 char str [100]; gets (str);
它可以读取整行包含空格,读到回车停止,并且丢弃回车,但是它没有办法限制输入长度,如果用户输入字符超过数组容量,就会覆盖相邻内存,产生缓冲区溢出漏洞,现代编译器编译的时候经常会报警告,新项目不要继续使用 gets。
五 getchar 循环手动读取字符串
如果需要完全自定义读取规则,可以循环调用 getchar,每次读取一个字符存入 char 数组,设置最大下标防止越界,遇到回车停止读取,最后手动写入空字符。
这种方式优点是可以自定义终止条件,比如遇到指定符号停止,缺点是代码量更多,需要自己处理边界下标。
六 深度要点
C 语言字符串必须以 \0 作为结束标记,所有字符串处理函数比如 strlen strcpy 都是依靠这个标记识别字符串结尾,如果输入之后没有这个标记,函数读取会一直向后访问内存直到随机碰到空字符,产生乱码甚至程序崩溃。
输入缓冲区残留问题,比如先用 scanf 读取数字,再读取字符串,回车残留在缓冲区,下一次输入函数会直接读到空行,解决办法可以读取并丢弃多余换行符。
数组大小规划,定义数组的时候要预留一个字节专门存放结束标记,比如想存 99 个有效字符,数组至少定义成 100。
【常见问题】
问题 1 c 语言怎么输入字符串的时候可以包含空格
回答 1 c 语言怎么输入字符串想要包含空格,不建议使用 scanf% s,优先选用 fgets 或者 getchar 循环读取,scanf% s 碰到空格就会终止读取,无法完整获取带空格的整行内容。
问题 2 c 语言怎么输入字符串为什么 gets 不推荐继续使用
回答 2 c 语言怎么输入字符串里面 gets 没有长度校验,用户输入内容超过数组容量就会发生缓冲区溢出,存在安全隐患,C11 标准已经正式删除 gets,新项目推荐替换成 fgets。
问题 3 c 语言怎么输入字符串之后打印出现多余换行是什么原因
回答 3 c 语言怎么输入字符串使用 fgets 的时候,函数会把按下回车产生的换行符一起存入数组,打印的时候就会多一行,需要手动查找换行符并且替换成字符串结束标记。
问题 4 c 语言怎么输入字符串为什么 scanf 读取的时候不需要加取地址符号
回答 4 c 语言怎么输入字符串使用 scanf% s 的时候,数组名本身代表数组首地址,所以直接写数组名即可,如果额外加上取地址符会造成类型错误,编译报错。
【免责申明】
本文是 c 语言怎么输入字符串相关基础知识讲解,不同编译器对废弃函数兼容行为 警告等级存在差异,代码示例仅用于学习演示,实际生产项目需要结合缓冲区大小 输入合法性 异常输入做额外校验,本文不保证所有极端输入场景都安全,开发者自行承担程序运行风险。


