You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:39:46