P019 将前导*号移到尾部 ★★★

03-程序设计题 软件121, 唐鼎威 1049浏览

所属年份:2010.9;2011.3;
规定输入的字符串中只包含字母和*号。请编写函数fun,其功能是:将字符串中的前导*号全部移到字符串的尾部。

例如,字符串中的内容为:”*******A*BC*DEF*G****”,移动后,字符串中的内容应当是:”A*BC*DEF*G***********”。在编写函数时,不得使用C语言提供的字符串函数。

#include <stdio.h>
void  fun( char *a )
{

}

main()
{  char  s[81];  int  n=0;
   printf("Enter a string:\n");gets(s);
   fun( s );
   printf("The string after moveing:\n");puts(s);
}

【考点分析】
本题考查:移动字符串中指定字符的位置,一般采用while循环语句,通过指针型变量来完成。

【解题思路】
函数fun的功能:将字符串中的前导*号全部移到字符串的尾部。本题解题思路:(1)定义一个指针并指向字符串的首地址;(2)利用循环语句找出字符串的前导*号的个数n;(3)利用循环语句把剩余的字符拷贝到另一个字符串中;(4)在字符串的末尾接上n个*号。

【参考答案】

void  fun( char *a )
{
   int i=0,n=0;
   char *p;
   p=a;
   while (*p=='*')   /*判断*p是否是*号,并统计*号的个数*/  
   {
      n++;p++;
   }
   while(*p)       /*将前导*号后的字符传递给a*/       
   {
      a[i]=*p;i++;p++;
   }
   while(n!=0)
   {
      a[i]='*';i++;n--;
   }
   a[i]='\0';
}

下面的程序体现了一个思想:近可能的使用 for 循环,只有在无法用for循环清晰表示的情况下才使用while循环

#include <stdio.h>
void  fun( char *a )
{
    int i, j, n=0;
    char *p;
    for (p=a; *p=='*'; p++)
        n++;    
    for (i=0; *p; p++)
        a[i++] = *p;
    for (j=0; j<n; j++)
        a[i++] = '*';
    a[i]='\0';
}