请C语言大神帮帮忙

这是题目:下列给定程序中,函数fun的功能是:在形参s所指字符串中的每个数字字符之后插入一个*号。例如,形参s所指的字符串为"def35adh3kjsdf7",执行后结果为"def3*5*adh3*kjsdf7*"
注意:部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
void fun(char *s)
{ int i, j, n;
for(i=0; s[i]!='\0'; i++)
/**********found**********/
if(s[i]>='0' && s[i]<='9')
{ n=0;
/**********found**********/
while(s[i+1+n]!= '\0') n++;
for(j=i+n+1; j>i; j--)
/**********found**********/
s[j+1]= s[j];
s[j+1]='*'; (就是这里,求大神解释一下)
i=i+1;
}
}
main()
{ char s[80]="def35adh3kjsdf7";
printf("\nThe original string is : %s\n",s);
fun(s);
printf("\nThe result is : %s\n",s);
}

请问为什么是是s[j+1]=‘*’,是s[j+1]明明已经有了s[j]值了,
另外,我把s[j+1]改成了s[i+1]编译出来的答案也是对的。
估计好长没人想看,但还是想请C语言大神帮帮忙。

解析如下 :请笑纳
#include <stdio.h>
void fun(char *s)
{ int i, j, n;
for(i=0; s[i]!='\0'; i++)
/**********found**********/
if(s[i]>='0' && s[i]<='9')
{ n=0;
/**********found**********/
while(s[i+1+n]!= '\0') n++;//为了统计数字后有多少个字符,以便确立需要移多少次,
for(j=i+n+1; j>i; j--)//从末位开始移,
/**********found**********/
s[j+1]= s[j];//这一句for循环是为了把识别出数字的下一位,把后面的所有数字整体往后移动一位,
s[j+1]='*'; // (就是这里,求大神解释一下)--腾空的空位,赋*号 最后一次退出循环时,j-- == i
i=i+1;
}
}
main()
{ char s[80]="def35adh3kjsdf7";
printf("\nThe original string is : %s\n",s);
fun(s);
printf("\nThe result is : %s\n",s);
}追问

s[j]赋值给了s[j+1],再让s[j+1]=‘*’的话,不是把上一句的赋值s[j]给覆盖了吗?
额 我还认为 腾空的空位是 s[i+1],然后我试着把s[j+1]='*'改成 s[i+1]='*' 也能编译正确答案,不太理解。

追答

看来你对循环语句,还没了解,第一次循环的时候j+1此时为字符串最后字符7后面的那一位,是从最后一个往后移。

追问

哦,对对对,for循环只管它下面的一条语句,我以为它管了两条,谢谢啦

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-09-07
void fun(char *s)
{
int i, j, n;
for(i=0; s[i]!='\0'; i++){
if(s[i]>='0' && s[i]<='9')
{ n=0;
while(s[i+1+n]!= '\0') n++;
printf("n=%d\n",n);
for(j=i+n+1; j>i; j--)
s[j+1]= s[j]; //35adh3kjsdf7 循环之后变成 335adh3kjsdf7
//就是后一位复制前一位实现3之后加多一个元素
s[j+1]='*'; // 335adh3kjsdf7 赋值之后为 3*5adh3kjsdf7
// i=i+1;//因为加多了一个字符‘*’进去所以要从此字符后面开始
}//后面依次循环添加元素位数,并把数字后面的一个元素赋值为*
}
}追问

谢谢你

相似回答