C - 扩展字符串的内容

时间:2012-03-18 17:38:54

标签: c string

我正在编写一个扩展字符串str1并将其存储为str2的函数。通过扩展,我的意思是如果str1具有“a-d”,它应该作为“abcd”存储在str2中。我写了以下代码。我得到一个调试错误,即变量str1周围的堆栈已损坏。 有人可以指出出了什么问题吗? 感谢。

#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';
}

4 个答案:

答案 0 :(得分:3)

您没有为目标字符串(s2)分配足够的内存。但是你试图写信给它,这意味着你将写入你不拥有的内存,导致腐败。

您需要为s2使用动态分配(即使用malloc),但您首先需要计算所需的内存量。

答案 1 :(得分:1)

char s2[] = "";

这相当于写作

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

如果需要NUL终结符,它不能容纳多个字符(或者根本不能容纳)。

答案 2 :(得分:1)

问题是当你初始化s2时,你给它足够的空间容纳1个字符(即空终止'\ 0')。因此,当你写入s2:

s2[j] = ...

无法保证您正在写入什么内存。

要动态分配s2的内存,您需要使用malloc。换句话说,你需要弄清楚需要多少内存(即通过查找扩展字符串的长度),然后给s2留下很多内存,最后通过你编写的过程填充它。

答案 3 :(得分:0)

当前字符串s2位于堆栈上,用于main()的局部变量,并且只为一个字符分配一个字节。当您调用该函数时,它会传递s1和s2的堆栈地址。代码覆盖了函数main()的堆栈上s2旁边的任何内容。因此,错误。请使用Oli先生上面已经建议的动态内存分配。

希望我的解释可以帮到你。