C语言数组内存未初始化警告及字符串反转问题排查
C语言字符串反转程序优化思路
核心问题根源
警告“using uninitialized memory 'rev'”和运行乱码的本质原因:
rev数组未初始化,内存里存的是随机垃圾值- C语言里的字符串必须以
'\0'作为结束标记,如果反转后没加这个标记,printf会一直读内存直到碰到终止符,自然就输出乱码
分步优化思路
- 先初始化目标数组:定义
rev的时候直接初始化,比如写char rev[100] = {0};,这样数组里所有元素都会被初始化为0(也就是'\0'),直接解决未初始化内存的警告问题 - 给反转后的字符串加终止符:
- 先拿到输入字符串的长度(用
strlen()就行,记得要包含<string.h>头文件) - 把原字符串的字符从后往前逐个赋值到
rev数组里 - 反转完所有有效字符后,在
rev的最后一个有效字符的下一个位置手动加'\0',保证rev是合法的C语言字符串
- 先拿到输入字符串的长度(用
- 加边界检查:输入的字符串长度不能超过
rev数组的容量(比如数组大小是100,输入长度就得小于99,留一个位置给'\0'),避免数组越界搞出其他问题 - 验证反转逻辑:反转后可以逐个打印
rev的字符,确认顺序对不对,同时检查'\0'是不是在正确的位置
额外实用提示
- 读取输入的时候用
fgets()代替scanf("%s"),scanf碰到空格就停了,fgets能读整行包括空格,不过要注意fgets会把换行符也读进去,得手动处理掉 - 调用
strlen()之前,要确保输入的字符串已经正确以'\0'结尾,不然strlen也会读到垃圾值
内容的提问来源于stack exchange,提问作者Andrew B
相关产品推荐
相关产品推荐

