原创 C语言问题之:字符串问题收集1

2008-5-30 22:56 1850 1 1 分类: MCU/ 嵌入式
 

 



1 整数与字符串的转换


将整数转成字符串,思路之一:先计算出整数总共位数,并将字符串指针移到最后.
然后进行取余运算,每取一次将得到的字符放入字符串,指针前移.
需要注意的是:一开始要判断负数,并置'-'。


char *conv(int in, char *out)
{
   char *ret = out;
   int len = 0;
   int tmp;
   if (in < 0)
   {
    *out++ = '-';
    in = -in;
   }
   tmp = in;
   while(tmp>0) { out++;tmp = tmp/10;}
   *out = '\0';
   out--;
   do
   {
    *out--= '0' +in%10;
    in = in/10;
   }
   while(in>0);
   return ret;
}


-----------------------
另一种方法: 先转成字符串,然后将字符串整个倒序。


char *conv(int num, char *str){


int i = 0,j = 0, isneg = 0;
char tmp[10];
if(num < 0) {
isneg = 1;
num *= -1;
}
do{
       tmp [i++] = (num % 10) + '0';
      num /= 10;
} while (num);
if(isneg) tmp[i++] = '-';
while ( i> 0)
str[j++] = tmp[--i];
str[j] = '\0';


return str;
}


---------------------
递归方法
char* rcsv_str_from_i(int i_in,char* str_out)


{


       //static unsigned count="0";

       // in case it is a minor integer for the first time

       if (i_in<0)

       {

              i_in*=(-1);

              *str_out++='-';

       }

      

       if(i_in/10)       // not the most important bit in decimal, then recursively calling itself

       {

              str_out = rcsv_str_from_i(i_in/10,str_out);

              *str_out++=i_in%10+'0';

              *str_out = '\0';       // in case this is the last step

       }

       else // the most important bit

       {

              *str_out++=i_in+'0';

              *str_out = '\0';       // in case this is the last step

       }

      

       // return the address for the next valid char

       return str_out;             


}


---------------------------------
字符串转换成整数


int con_ctoi(char str[])
{

int ret = 0;
int isneg = 0;
int i = 0;
if(str[0] == '\0')
{
    isneg = 1;
   i++;
}


while(str != '\0')
{
   ret *= 10;
   ret += (str[i++] -'0');
}


if (isneg) ret *= -1;
return ret;

}



2 字符串逆转


void reverse(char str[]){


char tmp;
int start = 0;
int end = 0;
int i = 0;


while(str[i++] != '\0') end++;
end--;
while(end>start)
{
tmp = str[start];
str[start] = str[end];
str[end] = tmp;
start++;
end--;
}
}


考虑用指针实现


char* strrev2(const char* str)


{


       char* tmp = new char[strlen(str) + 1];


       strcpy(tmp,str);


       char* ret = tmp;



       char* p = tmp + strlen(str) - 1;



       while (p > tmp)


       {


              char t = *tmp;


              *tmp = *p;


              *p = t;



              --p;


              ++tmp;


       }



       return ret;


}



考虑做一些优化:主要在交换的地方做了。
      while (p > tmp)




       {


              *p ^= *tmp;


              *tmp ^= *p;             


              *p ^= *tmp;



              --p;


              ++tmp;


       }


   while(p >tmp)


       {


              *p = *p + *tmp;


              *tmp = *p - *tmp;


              *p = *p - *tmp;



              --p;


              ++tmp;


       }


--------------------------------------------
一个利用递归实现输出逆转字符串的方法,很简洁
void rev_out(char *str)
{
    if(*str != '\0')
      {
       rev_out(++str)
          putchar(*(str-1));
     }
}




char* strrev5(/*const */char* str,int len)


{


       if (len <= 1)


              return str;



       char t = *str;


       *str = *(str + len -1);


       *(str + len -1) = t;



       return (strrev5(str + 1,len - 2) - 1);


}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /1 下一条