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

时间:2011-09-07 21:41:22

标签: c

#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的大小增加并在源

之后为任何值产生垃圾

3 个答案:

答案 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