#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 :(得分:4)
您必须手动将结尾\0
包含在字符串中,也就是说,在add
的末尾,您必须添加:
dest[count] = '\0';
你知道,C中的字符串长度是在搜索\0
字符。您必须在每个C字符串的末尾包含其中一个。如果没有,该字符串可能包含任何垃圾,直到将要打印的第一个\0
。
最后,在创建dest
时,您还必须在一个中增加保留空间的长度以容纳结束0字符。 strlen
不计算结束0字符。
答案 1 :(得分:2)
您的odd
函数忘记NUL终止dest
,因此printf
继续快乐地读取字符串的预期结束,输出恰好在堆栈上的垃圾。
此外,dest
必须长一个字符,因为strlen
告诉字符串的长度不包括结束NUL,因此,如果source
是偶然所有奇数字符,你有一个(小)缓冲区溢出。
答案 2 :(得分:1)
您不会复制终止\0
。