问一道简单的C语言题(字符串处理)

/*假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。
例如,字符串中的内容为:***A*BC*DEF*G***,移动后字符串中的内容应当是:A*BC*DEF*G******。不使用字符串函数。*/
#include <stdio.h>

void fun(char *a)
{
int count=0,n=0,i,j;
while(*a++='*')
count++;
while(*a++)
n++;
for(i=n;i<=n+count-1;i++)
a[i]='*';
for(i=0,j=count;a[j];i++,j++)
a[i]=a[j];
a[i]=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);

}
//执行后错误,谁能告诉我哪错了?

while(*a++=='*')
count++;
while(*a++)
n++;
多明显啊
你执行完之后,你的指针a已经挪到了'\0’ 的后一位
然后你还执行
for(i=n;i<=n+count-1;i++)
a[i]='*';
n是记录正文部分的个数,你还要加到什么时候啊。
就好像题目的那个字符串,count=3,n=10
然后你还搞个 a[i]出来,你想怎样。
问题就是这里,你自己能改不。
还有这个时候的 a已经改变了,不是之前那个字符数组的首地址了。
这倒霉孩子
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-17
可以这样做:从后向前遍历,使用两个游标,一个记录当前读取的字符位置(称为r),另一个记录*写入的位置(称为w)。理论上,r<=w。每读到*时,就写入w位置,并将w减1。从后到前读出并处理完所有字符就结束了。
第2个回答  2011-09-17
s是字符串首地址,不能改变,也就是说不能拿来++
第3个回答  2011-09-18
#include <stdio.h>
#include<string.h>
void fun(char *a)
{
int count=0,n=0,i=0,j=0;
while(*(a+i++)=='*');
count=i-1;
while(*(a+i++));
n=i-1-count;
for(j=i-1;j<i-1+count;j++)
a[j]='*';
a[j]='\0';
for(i=0,j=count;a[j];i++,j++)
a[i]=a[j];
a[i]='\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);

}
第4个回答  2011-09-17
int count=0,n=0,i,j;
while(*a++='*') //要改为while(*a++=='*')
count++;追问

对的,这样改正后虽然执行不会出现错误了,但上述功能仍不能实现。也就是说还有功能上的错误。请再帮忙看一看。谢谢!