9
回答
将一个整数转化为字符串再与另一字符串连接
开发十年,就只剩下这套Java开发体系了   
#include<stdio.h>
void main()
{
 void turn(char *m,int t);
 void transform(char *m,char *n);
 void stract(char *p,char *n);
 char a[20],b[20],c[20],*m,*n,*p;
 int t;
 scanf("%s",a);
 scanf("%d",&t);
 m=b;
 n=c;
 p=a;
 turn(m,t);
 transform(m,n);
 stract(p,n);
 printf("%s",p);
}
void turn(char *m,int t)//*将一个整数转化为字符,如对123求余得3则*p=3,12再求余则得*(p+1)=2,有1<10则*(p+2)=1,再使*(p+3)='\0'则完成转换*//
{
 int n;
 char *p=m;
 while(t!=0)//是t判断条件
 {
  n=t%10;
  *p=n+'0';//转换成字符要+'0'
  t=t/10;
  if(t<10) {*(p+1)=t+'0';break;}
  p++;
 }
 *(p+2)='\0';
}
void transform(char *m,char *n)//*使转换的字符串反序排列*//
{
 int i,j,t;
 for(i=0;i<20;i++)
  if(*(m+i)=='\0') t=i;//==是比较,=是赋值
  for(i=t-1,j=0;i>=0;i--,j++)
   *(n+j)=*(m+i);
  *(n+j)='\0';
}
void stract(char *a,char *b)//*将两个字符串连接起来*//
{
 char *m=a,*n=b;
 while(*m!='\0') m++;
 while(*n!='\0')
 {
  *m=*n;
  m++;
  n++;
 }
 *m='\0';
} 
这样可以吗?
在vc中运行
举报
丁思
发帖于7年前 9回/1K+阅
共有9个答案 最后回答: 7年前
@丁思 看一眼, turn就有问题。我看到你写的 *(p+2)= '\0' ;了。你尝试这个函数,t小于10进入。应该就有问题。正确的这种逆序做法应该如下
void turn(char *m,unsigned int t){
   // while (t > 0){
  //  }
    *m++ = '0';
    *m = 0;
}
//以上是第一步
void turn(char *m,unsigned int t){
    if (t == 0) {
        *m++ = '0';    
    }else{ 
      while (t > 0){
        *m++ = (t % 10) + '0';
         t /= 10;
      }
   }
    *m = 0;
}
//以上是第2步此处有两个等同操作,% /
void turn(char *m,unsigned int t){
    if (t == 0) {
        *m++ = '0';    
    }else{ 
      
      while (t > 0){
        unsigned int tmp = t / 10;
          *m++ = t - tmp * 10 + '0';
         t = tmp;
      }
   }
    *m = 0;
}
//以上是处理完毕。

@丁思 你的trans基本没问题,但效率低。你的这个目标设计工作我用另一个函数给你调整一下。你看是否靠谱。你的目标就是将t的内容连到a里。那么我修改函数名位 strcat_by_dec(char*dst,unsigned int dec) 如下

void strcat_by_dec(char *dst,unsigned int dec){
    while (*dst++){};//找到dst的屁股
    if (dec == 0){
       *dst++ = '0';
    }else{
      char *tdst = dst;
      tdst += 10;//假设dec足够大到,需要能描述32位的10进制最多的字符空间
      while (dec > 0){
         unsigned int tmp = dec / 10;
         *tdst-- = dec - tmp * 10 + '0';
         dec = tmp;
      }
      {
         int bias = tdst - dst;
         int i;
         for (i = 0 ; i < 10 - bias ; i++){//回移修正
            *dst++ = *tdst++;
         }
/*
      这里的回移修正甚至可以再块点,如下上面同样调整位 12
         bias = 12 - bias; //修正到正确的位置
         while ((dst & 0x3) && (bias > 0)){
            *dst++ = *tdst++; bias--;
         } 
      
         while ( (bias >= 4)){
            *(int*)dst = *(int *)tdst; bias-=4;dst+=4; tdst+= 4;
         }     
         while (bias > 0){
           *dst++ = *tdst++; bias--;
         }
//不要担心这里代码多,但循环少。之所以调整10到12,是为了保证dst 和tdst 的地址,低2位相同。
实际上对于你这种小范围的数据COPY,可以更简单,不要用while,根据bias选择处理。我这里是通用
方式。
*/
       }
    }
    *dst = 0;
}

你需要注意,这里不要怕字符串预跳10个问题。因为假设你的外部空间分配不足,导致这里会溢出,那么必然存在unsigned int t 但大于一定值时,同样会溢出。这种属于一个类型的错误,不属于你这里的内部错误。不知道是否能理解。

顶部