首页 新闻 赞助 找找看

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

0
悬赏园豆:5 [已解决问题] 解决于 2022-09-09 16:38

今天在做练习题时遇到的奇怪问题,加了一些输出还是没有想明白问题在哪,主要问题是代码在何时更改了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);
}

输出如图!

象羊的主页 象羊 | 初学一级 | 园豆:191
提问于:2022-09-09 16:12
< >
分享
最佳答案
0

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

收获园豆:5
寂静的羽夏 | 小虾三级 |园豆:1781 | 2022-09-09 16:29

拓宽s2后问题完美解决

象羊 | 园豆:191 (初学一级) | 2022-09-09 16:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册