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个字节给
'\0',比如:// 假设最多需要lenA个字符,所以分配lenA+1的空间 char* C = malloc((lenA + 1) * sizeof(char)); - 同样要在处理完字符后给
C加上'\0',用完记得free(C)避免内存泄漏。
总结一下:只要保证处理后的字符串末尾有'\0',并且存储它的空间足够容纳有效字符加这个终止符,随机多余字符的问题就解决啦!
内容的提问来源于stack exchange,提问作者Leon Kagan
相关产品推荐
相关产品推荐

