这个字符串的长度怎么可能增加?

#include  #include  #include  char * odd(const char * S, char * dest); int main() { char * source = "abcdefghijklmnopacegiacegi"; unsigned int length = strlen(source); char dest[length]; printf("%s\n",odd(source, dest)); } char * odd(const char * source, char * dest) { int count = 0; unsigned int length = strlen(source); for(int i = 0; i < length; i++) { if( (source[i] %2 )!= 0) { dest[count] = source[i]; count++; } } return dest; } 

dest的大小增加并在源的长度之后为任何值产生垃圾

您必须手动将结尾\0包含在字符串中,也就是说,在add结束时,您必须添加:

 dest[count] = '\0'; 

你知道,C中的字符串长度是在搜索\0字符。 您必须在每个C字符串的末尾包含其中一个。 如果没有,该字符串可能包含任何垃圾,直到将要打印的第一个\0

最后,在创建dest ,您还必须将保留空间的长度增加到一个以容纳结束0字符。 strlen不计算结束0字符。

你的odd函数忘记了NUL-terminate dest ,所以printf继续愉快地读取字符串的预期结束,输出恰好在堆栈上的垃圾。

此外, dest必须是一个字符更长,因为strlen告诉字符串的长度不包括结束NUL,因此,如果source是偶然的所有奇数字符,你有一个(小)缓冲区溢出。

您不复制终止\0