今天在做练习题时遇到的奇怪问题,加了一些输出还是没有想明白问题在哪,主要问题是代码在何时更改了s1字符串的,因为我全程没有对s1做过任何更改。
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
提供的容量远远不够容纳字符串的长度,所以会出现这么问题。
如果想深究,前提请学习汇编,再继续谈。
拓宽s2后问题完美解决