// 题意: 在 字符串 的 数字 字符 后 插入一个 '*' 号 ...
#include <stdio.h>
void func(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++;
for(j=i+1+n;j>i;j--)
{s[j+1] = s[j]; }
s[j+1] ='*';
// 如果 把 这段 “注释段”变成 执行语句的话 ..
// 则会 出现 意向不到 的 错误 ..
}
}
void main()
{
char s[30]={"SMopitarSM4pitar3MopitarSMo28"};
func(s);
printf("%s\n",s);
}
这两个循环都是用前一个字符覆盖掉后一个字符,不同的是它们的循环的方向。一个是从字符串尾部到当前字符,一个是从当前字符到字符串尾部。从字符串尾部开始的循环因为后一个字符在被前一个字符覆盖前已经先保存到之后的位置上,所以能得到正确的结果。从当前字符开始的循环因为后一个字符没有先保存就被前一个字符覆盖,结果就是后面所有的字符都会被同一个字符所覆盖。更为严重的是这个循环会把做为字符串结束标志的'\0'也覆盖掉,再加上楼主你定义的字符数组太小,所以在printf函数输出字符串时可能会输出一些乱码。
s数组要设得足够大,否则把字符串的剩余部分往后挪的时候可能没有足够的空间来存
#include <stdio.h>
void func(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++;
s[i+1+n+1] = 0;
for(j=i+n+1;j>i;j--)
{s[j] = s[j-1]; }
s[j+1] ='*';
}
}
void main()
{
char s[100]={"SMopitarSM4pitar3MopitarSMo28"};
func(s);
printf("%s\n",s);
}