#include<stdio.h>
#include<string.h>
#include<ctype.h>
void fun(char *s)
{
int i;
for(i=strlen(s);i<0;--i)//
{
*(s+2*i)=*(s+i);
*(s+2*i-1)=' ';
}
}
int main()
{
char a[20];
printf("请输入一个字符串:\n");
gets_s(a,20);
fun(a);
printf("新字符串是:\n");
puts(a);
return 0;
}
看你的代码意思是想在每个字符之间插入空格,但你fun函数写法有错:
一、你的i循环,是自减循环,i初始是字符串的长度,那么循环条件写反了,不能写i<0,这样循环不执行。要么大于要么大于等于。
二、你想要在每个字符间插入空格,那么定义数组大小必须给空格留下位置,你定义20输入就用满是不行的。
三、关键!!!你定义数组大小20,gets_s写入上限也是20,i初值就是字符串长度,那么假设你输入把20个字符空间都填满了。那么fun函数中循环*(s+2*i)就直接访问到数组最大长度以外的地址了。这叫越界访问,是不允许的。
四、既然上面说的代码已经有错,错误基础上的运行结果,没有参考价值。
五、按照你的思路需插入空格的数量是长度-1,所以插入后长度为2*len-1,所以插入后的最后一个字符所在位置是s-字符串长度-1,就是s-2*i-1-1。
我下面把你的代码改一下给你参考(由于gets_s不是基本库函数,我的编译器下没有,用scanf临时代替,scanf没有输入保护,不要输入超出长度):
#include<stdio.h>
#include<string.h>
#include<ctype.h>
void fun(char *s)
{
int i;
//需插入空格的数量是长度-1,所以插入后的字符串长度为(strlen(s)-1)+strlen(s)
for(i=strlen(s),*(s+2*i-1)=0;i>0;--i)//(s+2*i-1)=0提前给插入后字符串末尾添0
//按你的思路,最后一个字符*(s+i-1)移动到*(s+2*i-2),前一位插空格
{
*(s+2*i-2)=*(s+i-1);
*(s+2*i-3)=' ';
}
}
int main()
{
char a[100];//这里定义大一点,否则请用malloc定义动态字符数组
printf("请输入一个字符串(不超过20长度的字符串):\n");
scanf("%s",a);
fun(a);
printf("新字符串是:\n");
puts(a);
return 0;
}