一个简单c程序问题,路过的请帮忙看一下!

来源:百度知道 编辑:UC知道 时间:2024/05/14 05:03:15
/*假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。
例如,字符串中的内容为:***A*BC*DEF*G***,移动后字符串中的内容应当是:A*BC*DEF*G******。在编写函数时,不得使用C语言提供的字符串函数。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。*/
#include <stdio.h>
void fun(char *a)
{
char *p2;
int n=0,i,j,m=0;
while(*a!='\0')
{
++n;
a++;
}
for(i=0;i<n;i++)
p2[i]=a[i];
do
{
m++;
a++;
}while(*a=='*');
for(j=0,i=m;j<n-1-m;j++)
a[j]=p2[i++];
i=0;
for(j=n-1-m;j<n-1;j++)
a[j]=p2[i++];
a[j]='\0';
}
main()
{
char s[81],*p; int n=0;
printf("Enter a string:\n");
gets(s);
fun(s);
printf("The string after moveing:\n");
puts(s);
}
fun函数有没有什么问题,我用vc++6.0编译时“……遇到问题需要关闭……”

while(*a!='\0')
{
++n;
a++;
} //这个while完了后,a已经指向了字符串的最后
for(i=0;i<n;i++)
p2[i]=a[i]; //这个是通过下标访问,不会改变a的值
do
{
m++;
a++; //a在这里再加就越界了!!!
}while(*a=='*');

在main前加个void试试

void fun(char *a)
{
int n=0,i,j,m=0;

char* tmp=a;//不能改源地址
while(*tmp!='\0')
{
++n;
tmp++;
}
char *p2=new char[n+1];//保证暂时指针有效

for(i=0;i<n;i++)
p2[i]=a[i];

tmp=a;//不能改源地址
do
{
m++;
tmp++;
}while(*tmp=='*');
for(j=0,i=m;j<n-m;j++)
{
a[j]=p2[i++];
}
i=0;
for(j=n-m;j<=n-1;j++)
a[j]=p2[i++];
a[j]='\0';

if (p2!=NULL)//清理暂时指针分配的内存
{
delete[] p2;
p2=NULL;
}
}