C语言中“清理”数组后仍存垃圾值?附从标准输入首行提字符串问题
嘿,我来帮你捋捋这个问题!你碰到的“清理数组后还有垃圾值”的情况,大概率是代码里的几个小疏忽导致的,咱们一个个拆解来看:
第一个明显的bug:重复初始化str1,却漏掉了str2
你看这段代码:
memset(str1, 0, MAX_LINE_LEN); memset(str1, 0, MAX_LINE_LEN); // 这里重复初始化str1了!
你连续两次给str1清0,但str2完全没做初始化操作啊!str2作为局部数组,默认是栈上的随机值(也就是你说的“垃圾值”),如果后续没正确给它赋值,自然会残留这些乱码。
第二个可能的坑:提取字符串的方式没处理好
你代码里用fgets读了一行,但没写后续怎么拆分出str1和str2。如果是用sscanf或者strtok这类工具,得确保操作能正确给字符串加上终止符'\0':
- 比如用
sscanf的话,只要匹配成功,它会自动给目标字符串末尾加'\0'; - 如果是手动遍历字符拆分,一定要记得在每个字符串的末尾手动加上
'\0',不然printf这类函数会一直读到内存里的随机值,直到碰到'\0'为止。
给你修正后的示例代码
我把你的代码补全并修正了,你可以参考:
#include <stdio.h> #include <string.h> #define MAX_LINE_LEN 20 int main(void) { char heightWidth[MAX_LINE_LEN]; memset(heightWidth, 0, MAX_LINE_LEN); fgets(heightWidth, MAX_LINE_LEN, stdin); // 修正:给两个数组都做初始化 char str1[MAX_LINE_LEN]; char str2[MAX_LINE_LEN]; memset(str1, 0, MAX_LINE_LEN); memset(str2, 0, MAX_LINE_LEN); // 用sscanf提取前两个字符串,自动处理终止符 if (sscanf(heightWidth, "%s %s", str1, str2) == 2) { printf("第一个字符串:%s\n", str1); printf("第二个字符串:%s\n", str2); } else { printf("输入格式不对,没读到两个字符串\n"); } return 0; }
额外提醒:memset清0的真实作用
memset是把数组的每个字节设为0(也就是ASCII码的'\0'),这样数组一开始就是合法的空字符串。但如果后续操作覆盖了部分数组但没补全终止符,还是可能出现问题——不过因为你已经清过0,后面的内存都是'\0',不会出现垃圾值;但要是像你之前那样漏了初始化某个数组,那它的初始状态就是随机垃圾值,没被覆盖的部分自然会保留下来。
内容的提问来源于stack exchange,提问作者ptk
相关产品推荐
相关产品推荐

