这个字符串的长度怎么可能增加?
#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
。