面试题之金山(函数练习2)_字符排序(字母、数字及其它字符)ParseString

函数练习2

写一个函数,实现对给定的字符串(字符串里面包括:英文字母,数字,符号)的处理。经过处理后的字符串其内容按字母,数字,符号的顺序存放。函数声明如下:
void ParseString(char* pstr);
要求:
a. 不能改函数声明;
b. 不改变字母数字等在字符串中原有的出现顺序;
c. 直接使用pstr所值指缓冲区,不允许另开缓冲区。
例如:给定的字符串为:A,2.d?3!e4r87we79...
输出结果为:Aderwe2348779,.?!...

在解这道题时,自己想了一下.一开始的想法是先判断字符串里的字母,若是字母就不管,否则就把这个字符取出,而此字符后的所有字符均向前移.如此,就把取出的字符放在字符串的最后一个空间上.
但想法是出来了,当在写代码的时候,却死活都不知怎样下手.于是,上网找下,果然在一个blog中找到了一份.心里高兴啊!马上下来试下.可是结果是只能把字母,数字及其它字符区分开来而已,原来的出现顺序已乱了.
于是,还是自己做吧.欲求别人,还不如自己动手.俗称自己动手丰衣足食吗!!!
终于,想出了个比第一次自己想出的方法还好的算法,如下:
                    A , 2 d ? 3 !
1)先依次判断是否为字母,若是,则先取出此字母,而其前的字符到上个字母的后的字符,都依次先后移一步.
2)对应于数字就是把判断函数改下而已,具体的代码在最下:

编程总结:
在这条编程题目中,我发现自己的字符串数组还不是很熟悉.一个char* sptr函数参数,其在main()中不就是一个char数组而已
,且ParseString(char* sptr)的调用函数是ParseString(s),s为char[] .在函数中可直接用索引来调用数组中的某个值.
而最大的收获莫过于,发现自己的编写代码能力很差.其原因应该是少练习,且基础不扎实.我想解决的方法是坚持练习及复习,
做总结.


#include <stdio.h>
#include <string.h>

void ParseString(char* pstr)
{
      char tempCh;
      int i=0,j=0,k=0; 
      //计数器 i表示算到第几个字符了 j表示有几个字母(或数字)了  而k用于移动字符时的计数器
      while(pstr[i]!='\0')
      {
           if(isalpha(pstr[i])) //若是字母,则先取出,再将其前到上个字母的字符都向后移一位,最后放在上个字母后
           {
                tempCh=pstr[i];
                for(k=i;k>=j;k--)
                {
                      pstr[k]=pstr[k-1];
                }
                pstr[j]=tempCh;

                j++;
           }
            i++;
      }

      i=j; //字母全放好了,有几个字母,我们就从第几个字符开始计数,因只剩下数字和其它字符没有排序而已

      while(pstr[i]!='\0')
      {
           if(isdigit(pstr[i]))
           {
                 tempCh=pstr[i];
                 for(k=i;k>=j;k--)
                 {
                       pstr[k]=pstr[k-1];
                 }
                 pstr[j]=tempCh;

                 j++;
      }

      i++;
 }

}

int main()
{
 char s[100];

 scanf("%s",&s);

 ParseString(s);

 printf("%s",s);

 //scanf("%s",&s);

 return 0;
}

posted @ 2008-05-10 21:16  Arishuang  阅读(1247)  评论(1编辑  收藏  举报