C语言 编写函数itoa(int n,char *p)

编写函数itoa(intn,char*p)实现将整数n转换为字符串存储到p中。要求在主函数中输入整数n,调用itoa函数,并将结果输入到字符串。注意:整数不是一位数哦--... 编写函数itoa(int n,char *p)实现将整数n转换为字符串存储到p中。要求在主函数中输入整数n,调用itoa函数,并将结果输入到字符串。
注意:整数不是一位数哦- -
展开
 我来答
Arthurzss
2014-07-01 · TA获得超过1661个赞
知道小有建树答主
回答量:496
采纳率:100%
帮助的人:239万
展开全部

有2种方式实现,其中两种是使用系统函数,另一种是直接自己编写。

下面的代码就是2种方式的实现,包括任意整数(2的31次方以内)都可以。可自己选择需要的实现方式。

1. 利用系统函数。sprintf(str,"%d",value);str是转化存储的位置,%d表示十进制格式,value是要转化的数字。所以代码可以为:

char * itoa(int n, char * p)
{
    sprintf(p, "%d", n);
    return (p);
}

2. 自己编写。由于计算方法是每次都除以10和对10取余数,余数以倒序的顺序排列就是结果,所以最佳方法是用递归函数(当然循环也可以,但需要最后再进行倒序)。递归代码如下:

static int i = 0;

char * itostr(int n, char * p)//递归函数
{
    if (n < 10)           //递归结束条件
    {
        p[i] = n + '0';   //当前数转换成字符放入字符串 
    }
    else
    {
        itostr(n / 10, p);//递归调用 
        i++;              //字符串索引+1 
        n %= 10;          //计算当前值
        p[i] = n + '0';   //当前数转换成字符放入字符串 
    }
    p[i+1] = '\0';        //字符串结束标志 
    return (p);
}

char * itoa(int n, char * p)
{
    i = 0;//初始化下标为0
    itostr(n, p);
}

最后测试代码如下(以自己编为例,其余只要替换intoa函数中的代码内容即可):

#include <stdio.h>

static int i;

char * itostr(int n, char * p)//递归函数
{
    if (n < 10)           //递归结束条件
    {
        p[i] = n + '0';   //当前数转换成字符放入字符串 
    }
    else
    {
        itostr(n / 10, p);//递归调用 
        i++;              //字符串索引+1 
        n %= 10;          //计算当前值
        p[i] = n + '0';   //当前数转换成字符放入字符串 
    }
    p[i+1] = '\0';        //字符串结束标志 
    return (p);
}

char * itoa(int n, char * p)
{
    i = 0;//初始化下标为0
    itostr(n, p);
}

int main ()
{
  int num;
  char str[33];
  printf ("Enter a number: ");
  scanf ("%d",&num);
  itoa (num, str);
  printf ("The number: %s\n", str);
  return 0;
}
追问
求教 static是什么意思呢?
追答

静态变量。在这里由于i是全局的,不是静态也无所谓,直接int i就行


上面代码没有考虑负数,如果加入负数的话:

int i;

char * itostr(int n, char * p)
{
    if (n < 0)            //负数情况
    {
        p[0] = '-';       //加负号 
        i++;
        itostr(-n, p);    //递归调用 
    }
    else if (n < 10)      //递归结束条件
    {
        p[i] = n + '0';   //当前数转换成字符放入字符串 
    }
    else
    {
        itostr(n / 10, p);//递归调用 
        i++;              //字符串索引+1 
        n %= 10;          //计算当前值
        p[i] = n + '0';   //当前数转换成字符放入字符串 
    }
    p[i+1] = '\0';        //字符串结束标志 
    return (p);
}

char * itoa(int n, char * p)
{
    i = 0;
    itostr(n, p);
}
heqintt
2017-11-23
知道答主
回答量:1
采纳率:0%
帮助的人:926
引用Arthurzss的回答:
有2种方式实现,其中两种是使用系统函数,另一种是直接自己编写。
下面的代码就是2种方式的实现,包括任意整数(2的31次方以内)都可以。可自己选择需要的实现方式。
1. 利用系统函数。sprintf(str,"%d",value);str是转化存储的位置,%d表示十进制格式,value是要转化的数字。所以代码可以为:
char * itoa(int n, char * p){ sprintf(p, "%d", n); return (p);}2. 自己编写。由于计算方法是每次都除以10和对10取余数,余数以倒序的顺序排列就是结果,所以最佳方法是用递归函数(当然循环也可以,但需要最后再进行倒序)。递归代码如下:
static int i = 0;char * itostr(int n, char * p)//递归函数{ if (n < 10) //递归结束条件 { p[i] = n + '0'; //当前数转换成字符放入字符串 } else { itostr(n / 10, p);//递归调用 i++; //字符串索引+1 n %= 10; //计算当前值 p[i] = n + '0'; //当前数转换成字符放入字符串 } p[i+1] = '\0'; //字符串结束标志 return (p);}char * itoa(int n, char * p){ i = 0;//初始化下标为0 itostr(n, p);}最后测试代码如下(以自己编为例,其余只要替换intoa函数中的代码内容即可):
#include <stdio.h>static int i;char * itostr(int n, char * p)//递归函数{ if (n < 10) //递归结束条件 { p[i] = n + '0'; //当前数转换成字符放入字符串 } else { itostr(n / 10, p);//递归调用 i++; //字符串索引+1 n %= 10; //计算当前值 p[i] = n + '0'; //当前数转换成字符放入字符串 } p[i+1] = '\0'; //字符串结束标志 return (p);}char * itoa(int n, char * p){ i = 0;//初始化下标为0 itostr(n, p);}int main (){ int num; char str[33]; printf ("Enter a number: "); scanf ("%d",&num); itoa (num, str); printf ("The number: %s\n", str); return 0;}
展开全部
char * itoa(int n, char * p){ i = 0;//初始化下标为0 itostr(n, p); return 0; //加这句才能编译通过}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qrspace
2014-07-01 · TA获得超过2046个赞
知道小有建树答主
回答量:1038
采纳率:93%
帮助的人:396万
展开全部
// 调用这个函数有一个假设,给定的参数p指向一个足够的保存结束数字的控件
// 根据整数的最大范围进行估算后加上符号位、结束字符(null)
//
// 如果调用时给出的参数p是0,则返回转换后的字符总数。
// 参数:
// int n 要转化的数字
// char *p 保存转换后数字的指针
// 返回:
// 字符串的长度(不包括结束字符)
//
int itoa(int n,char* p)
{
char* tmp;
int count;
int r;
char m;
char rp[32];//临时变量,保存转化后的数字字符串
int minus=0;
count=0;
rp[31]=0;//最后一个是null
tmp=rp+30;//指向倒数第一个数字

if(n<0)
{
minus=1;
n=-n;
}
r=n%10;//余数
n=n/10;//商
*tmp=nchars[r];
tmp--;
count++;
while(n!=0)
{
r=n%10;
n=n/10;
*tmp=(char)(r+0x30);
tmp--;
count++;
}

// 处理符号
if(minus!=0)
{
*tmp='-';
count++;
} else
tmp++;//指向第一个数字

if(p!=NULL)
{
// 如果给定了有效的参数 p,则复制结果
for(n=0;n<=count;n++)
{
p[n]=tmp[n];
}
}

// 返回转换后的字符总数,不包括结束字符(null)
return count;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
玫瑰仙羽蝶
2018-01-25
知道答主
回答量:1
采纳率:0%
帮助的人:904
引用Arthurzss的回答:
有2种方式实现,其中两种是使用系统函数,另一种是直接自己编写。
下面的代码就是2种方式的实现,包括任意整数(2的31次方以内)都可以。可自己选择需要的实现方式。
1. 利用系统函数。sprintf(str,"%d",value);str是转化存储的位置,%d表示十进制格式,value是要转化的数字。所以代码可以为:
char * itoa(int n, char * p){ sprintf(p, "%d", n); return (p);}2. 自己编写。由于计算方法是每次都除以10和对10取余数,余数以倒序的顺序排列就是结果,所以最佳方法是用递归函数(当然循环也可以,但需要最后再进行倒序)。递归代码如下:
static int i = 0;char * itostr(int n, char * p)//递归函数{ if (n < 10) //递归结束条件 { p[i] = n + '0'; //当前数转换成字符放入字符串 } else { itostr(n / 10, p);//递归调用 i++; //字符串索引+1 n %= 10; //计算当前值 p[i] = n + '0'; //当前数转换成字符放入字符串 } p[i+1] = '\0'; //字符串结束标志 return (p);}char * itoa(int n, char * p){ i = 0;//初始化下标为0 itostr(n, p);}最后测试代码如下(以自己编为例,其余只要替换intoa函数中的代码内容即可):
#include <stdio.h>static int i;char * itostr(int n, char * p)//递归函数{ if (n < 10) //递归结束条件 { p[i] = n + '0'; //当前数转换成字符放入字符串 } else { itostr(n / 10, p);//递归调用 i++; //字符串索引+1 n %= 10; //计算当前值 p[i] = n + '0'; //当前数转换成字符放入字符串 } p[i+1] = '\0'; //字符串结束标志 return (p);}char * itoa(int n, char * p){ i = 0;//初始化下标为0 itostr(n, p);}int main (){ int num; char str[33]; printf ("Enter a number: "); scanf ("%d",&num); itoa (num, str); printf ("The number: %s\n", str); return 0;}
展开全部
else语言里面,应该为
{
itostr(n/10,p);
n %= 10;
p[i] = n + '0';
i++;
}
要不大佬再斟酌一下?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式