C语言字符串自动改变问题

今天在做练习题时遇到的奇怪问题,加了一些输出还是没有想明白问题在哪,主要问题是代码在何时更改了s1字符串的,因为我全程没有对s1做过任何更改。

include <stdio.h>

include <string.h>

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

k=strlen(s2);
for(i=1;s1[i+1]!='\0';i++){
if(s1[i]=='-'){
if((s1[i+1]<='z'&&s1[i+1]>='a'&&s1[i-1]<='z'&&s1[i-1]>='a'&&s1[i+1]>=s1[i-1])||(s1[i+1]<='Z'&&s1[i+1]>='A'&&s1[i-1]<='Z'&&s1[i-1]>='A'&&s1[i+1]>=s1[i-1])||(s1[i+1]<='9'&&s1[i+1]>='0'&&s1[i-1]<='9'&&s1[i-1]>='0'&&s1[i+1]>=s1[i-1]))
{
for(j=0;j<(s1[i+1]-s1[i-1])&&printf("%s",s1);j++){
s2[k+j]=s1[i-1]+j;
printf("%3d  %s  %d\n",j,s1,s1[i-1]);
}
s2[k+j]='\0';
}
}
}

}
int main(){
char s1[]="a-z";
char s2[]="sdbver";
expand(s1,s2);
printf("%s",s2);
}

输出如图!

回答

其实你改了,就是这句s2[k+j]=s1[i-1]+j;
你可能疑惑,我不是改的s2吗?和s1啥关系?因为你在修改s2的时候在某个时刻下标溢出,导致UB(未定义行为)。
我看你的函数是拓展字符串,但s2提供的容量远远不够容纳字符串的长度,所以会出现这么问题。
如果想深究,前提请学习汇编,再继续谈。

以上是C语言字符串自动改变问题的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>