EDN首页   博客首页

日志档案

发表于 2008-5-30 22:56:24

1

标签: c  字符串    

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

 
 

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[i] != '\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);

}

系统分类: 嵌入式   |   用户分类: 无分类   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(161)    回复(0)  

投一票您将和博主都有获奖机会!