C语言编写限制名字输入长度程序及现有代码运行异常问题排查
问题修复方案
现有代码的错误原因
- 缓冲区溢出问题:C 语言字符串必须以
\0作为结束标记,你声明的char firstname[5]仅能存储4个有效字符,剩余1个位置留给结束符。输入newton共6个字符,超出数组容量后会覆盖栈上其他内存数据,直接导致输出乱码、程序行为异常。 scanf用法错误:数组名firstname本身就是首元素的内存地址,不需要额外加取地址符&,虽然部分场景下加了也能运行,但属于类型不匹配的错误写法。- 无输入长度限制:默认的
%s格式符不会检查缓冲区容量,会把所有输入的非空白字符全部写入目标数组,是典型的缓冲区溢出安全漏洞。
实现10字符长度限制的修复代码
#include <stdio.h> int main() { // 10个有效字符 + 1个结束符预留位,数组长度设为11 char firstname[11]; printf("Enter your name: "); // %10s 限制最多读取10个非空白字符,自动预留结束符存储位置 scanf("%10s", firstname); printf("\nYour name: %s", firstname); return 0; }
可选优化逻辑
如果需要处理用户输入超出10个字符的场景,避免剩余字符残留在输入缓冲区影响后续操作,可以在scanf后补充清空缓冲区的代码:
// 清空输入缓冲区剩余未读字符 int c; while ((c = getchar()) != '\n' && c != EOF);
内容的提问来源于stack exchange,提问作者newton
相关产品推荐
相关产品推荐

