2012-03-18 114 views
1

我正在寫一個函數來擴展字符串str1並將其存儲爲str2。通過擴展,我的意思是如果str1具有「a-d」,它應該作爲「abcd」存儲在str2中。我寫了下面的代碼。我得到一個調試錯誤,堆棧變量str1被損壞。 有人可以指出哪裏出了問題? 謝謝。C - 擴展字符串的內容

#include <stdio.h> 

void expand(char s1[], char s2[]); 

int main() { 

    char s1[] = "Talha-z"; 
    char s2[] = ""; 

    expand(s1, s2); 
    printf(s2); 

} 

void expand(char s1[], char s2[]) { 
    int i = 0; 
    int j= 0; 
    int k, c_next; 

    while (s1[i] != '\0') { 
     switch (s1[i]) { 
     case ('-') : 
      c_next = s1[i+1]; 
      for (k = 1; k < c_next; k++) { 
       s2[j] = s1[i] + k; 
       j++; 
      } 
      break; 
     } 

     i++; 
     j++; 
    } 
    s2[j] = '\0'; 
} 
+1

通過「展開」,你寫的超出了原始字符串的末尾。你必須使用動態內存分配和realloc()。 – 2012-03-18 17:41:41

+0

這可能值得解釋任何其他要求。 「Yalha-z」應該生產什麼?當str1不包含' - '時應該發生什麼?如果以' - '開始或結束會發生什麼? – gbulmer 2012-03-18 19:08:12

回答

3

您沒有爲目標字符串分配足夠的內存(s2)。但是你正試圖寫信給它,這意味着你將寫入你不擁有的記憶中,導致腐敗。

您將需要使用動態分配s2(即通過使用malloc),但您首先需要計算您需要多少內存。

+0

謝謝,我已修復該問題。我沒有按預期得到結果。不知道我是否正在切換權利? – yukon 2012-03-18 17:50:37

+0

@yukon:你應該調試你的程序,或者通過運行調試器,或者通過添加大量的打印語句來觀察變量的中間值。 – 2012-03-18 17:51:23

1
char s2[] = ""; 

這相當於寫

char s2[1] = { '\0' }; 

它不能持有多單字符以上(或根本沒有,如果需要NUL終止)。

1

問題是當你初始化s2時,你給它足夠的空間給1個字符(即空值終止'\ 0')。因此當你寫入s2時:

s2[j] = ... 

對於你寫入的內存沒有保證。

要動態分配s2的內存,您需要使用malloc。換句話說,您需要計算出需要多少內存(即通過查找擴展字符串的長度),然後給s2多少內存,最後通過您編寫的過程填充內存。

0

目前的字符串s2在main()的局部變量的堆棧上,並且僅爲一個字符分配一個字節。當你調用這個函數時,它會通過s1和s2的堆棧地址。代碼覆蓋函數main()堆棧中s2旁邊的任何內容。因此,錯誤。請按照上面Oli先生的建議使用動態內存分配。

希望我的解釋能幫助你。