2011-09-07 23 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