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

C语言程序移除子串后输出出现多余随机字符求助

解决移除子串后输出随机多余字符的问题

嘿,看你描述的情况——移除子串功能正常,但输出带随机垃圾字符,这问题我熟得很!十有八九是你处理后的结果字符串没加终止符'\0'。C语言里字符串可不是靠数组长度判断结尾的,得靠这个'\0'告诉printf这类函数“到这就停,别往下读了”,不然它就会顺着内存一直瞎读,把后面的垃圾数据也打出来。

常见错误原因&修复方法

我先模拟下你可能写的错误代码,再给你修正:

错误示例(没加终止符)

#include <stdio.h>
#include <string.h>

int main() {
    char A[] = "asdLEONasd";
    char B[] = "asd";
    char C[100];
    int i = 0, j = 0;
    int lenA = strlen(A);
    int lenB = strlen(B);

    while (i < lenA) {
        // 匹配到子串就跳过
        if (strncmp(&A[i], B, lenB) == 0) {
            i += lenB;
        } else {
            // 拷贝不匹配的字符到结果数组
            C[j++] = A[i++];
        }
    }
    // 这里漏掉了关键的终止符!
    printf("结果:%s\n", C);
    return 0;
}

这段代码里,C数组只存了有效字符,但末尾没有'\0',printf就会一直读到内存里碰巧出现的'\0'为止,中间的随机字符就是这么来的。

修正后的代码

只需要在循环结束后,给结果数组的末尾加上'\0'就行:

#include <stdio.h>
#include <string.h>

int main() {
    char A[] = "asdLEONasd";
    char B[] = "asd";
    char C[100];
    int i = 0, j = 0;
    int lenA = strlen(A);
    int lenB = strlen(B);

    while (i < lenA) {
        if (strncmp(&A[i], B, lenB) == 0) {
            i += lenB;
        } else {
            C[j++] = A[i++];
        }
    }
    // 关键:添加字符串终止符,告诉程序这是字符串结尾
    C[j] = '\0'; 
    printf("结果:%s\n", C); // 现在只会输出"LEON"
    return 0;
}

额外注意事项

如果你的代码是用动态内存分配(比如malloc)来存结果的,还要注意两点:

  1. 分配内存时要多留1个字节给'\0',比如:
    // 假设最多需要lenA个字符,所以分配lenA+1的空间
    char* C = malloc((lenA + 1) * sizeof(char));
    
  2. 同样要在处理完字符后给C加上'\0',用完记得free(C)避免内存泄漏。

总结一下:只要保证处理后的字符串末尾有'\0',并且存储它的空间足够容纳有效字符加这个终止符,随机多余字符的问题就解决啦!

内容的提问来源于stack exchange,提问作者Leon Kagan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:27:00