2011-09-07 61 views
1
#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增加的大小和源这个字符串的长度是如何增加的?

回答

4

后的长度产生任何价值的垃圾必须手动包括结束\0字符串,也就是说,在add末,你必须添加:

dest[count] = '\0'; 

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

最后,在创建dest时,还需要增加一个保留空间的长度以容纳结尾为0的字符。 strlen不计算结尾0字符。

+0

* sma额*谢谢 –

2

您的odd函数忘记NUL终止dest,所以printf继续愉快地读取超过字符串的预期末尾,输出正好在堆栈上的垃圾。

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

1

您不复制终止\0

相关问题