我正在编写一个扩展字符串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';
}
答案 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先生上面已经建议的动态内存分配。
希望我的解释可以帮到你。