C语言 编写函数itoa(int n,char *p)
编写函数itoa(intn,char*p)实现将整数n转换为字符串存储到p中。要求在主函数中输入整数n,调用itoa函数,并将结果输入到字符串。注意:整数不是一位数哦--...
编写函数itoa(int n,char *p)实现将整数n转换为字符串存储到p中。要求在主函数中输入整数n,调用itoa函数,并将结果输入到字符串。
注意:整数不是一位数哦- - 展开
注意:整数不是一位数哦- - 展开
4个回答
展开全部
有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);
}
引用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;}
有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; //加这句才能编译通过}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
// 调用这个函数有一个假设,给定的参数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;
}
// 根据整数的最大范围进行估算后加上符号位、结束字符(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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
引用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;}
有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++;
}
要不大佬再斟酌一下?
{
itostr(n/10,p);
n %= 10;
p[i] = n + '0';
i++;
}
要不大佬再斟酌一下?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询