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

自定义gets()/puts()替代函数的C程序输出垃圾字符,原因何在?

你的字符串为啥带垃圾字符?原因和修复方案来了!

嘿,兄弟,我看了你的代码,立马就明白为啥输出会带垃圾字符了——你的自定义xgets()函数没给字符串加C语言字符串必须的终止符'\0'!

C语言里所有处理字符串的逻辑(不管是标准库的puts()还是你自己写的xputs()),都是靠'\0'来识别字符串结束位置的。如果没有这个标记,程序就会顺着内存一直读,直到碰巧碰到一个'\0'为止,中间读出来的那些乱七八糟的内容就是你看到的垃圾字符。

再仔细看你的xgets()代码:

  • 你循环读取字符,直到碰到换行符'\n'就跳出,但你既没把这个换行符替换成'\0',也没在字符串末尾补上这个终止符。
  • 还有个小语法错误:else break...这里应该写成else break;

给你改好的xgets()函数,两种写法都可以:

写法一:碰到换行符直接替换成终止符

void xgets(char *a) {
    printf("Enter string\n");
    while(1) {
        scanf("%c", a);
        if(*a != '\n') {
            a++;
        } else {
            // 把换行符换成字符串终止符,结束循环
            *a = '\0';
            break;
        }
    }
}

写法二:循环结束后手动添加终止符

void xgets(char *a) {
    printf("Enter string\n");
    while(1) {
        scanf("%c", a);
        if(*a != '\n') {
            a++;
        } else {
            break;
        }
    }
    // 在字符串末尾补上终止符,覆盖掉刚才读取的换行符
    *a = '\0';
}

另外还要提醒你:现在这个xgets()和原版gets()一样有缓冲区溢出的风险——如果用户输入的字符串长度超过你定义的str[25],就会越界写内存,搞不好会出大问题。最好给xgets()加个长度限制,比如这样:

void xgets(char *a, int max_len) {
    printf("Enter string\n");
    int i = 0;
    // 留一个位置给终止符,所以最多读max_len-1个字符
    while(i < max_len - 1) {
        scanf("%c", &a[i]);
        if(a[i] == '\n') {
            break;
        }
        i++;
    }
    // 无论如何都要加终止符
    a[i] = '\0';
}

然后在main()里调用的时候改成xgets(str, 25);就安全多啦!

内容的提问来源于stack exchange,提问作者Swapnil Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:58:09