近期遇到一个问题就是,假设我有一个整形数组int a[3] = {1, 2, 3};
而我想以字符串的形式输出“123”,所以我想当然的写下了如下代码:
printf("%s\n", a);
结果是一堆乱码。
我又实验了一个字符数组char b[3] = {a, b, c};
printf("%s\n", b);
输出的内容是"abc+一些乱码"。
一个字符数组的输出内容是非常容易理解的,输出abc后由于没有结束字符'\0'所以发生了数组越界访问,从而输出乱码。
而整形数也可理解,它以4个字节存储整形数,然后按字节输出字符,肯定出错。
要想将一个整形数按字符串的形式输出,有很多可以调用的库函数
atof(将字符串转换成浮点型数)
atoi(将字符串转换成整型数)
atol(将字符串转换成长整数数)
strtod(将字符串转换成浮点数)
strtol(将字符串转换成长整型数)
strtoul(将字符串转换成无符号长整型数)
toascii(将整型数转换成合法的ASCII 码字符)
toupper(将小写字母转换成大写字母)
tolower(将大写字母转换成小写字母)
itoa
功
能
:
把一整数转换为字符串
用
法
:char *itoa(int value, char *string, int radix);
详细解释
:itoa
是英文
integer
to
array(
将
int
整型数转化为一个字符串
,
并将值保存
在数组
string
中
)
的缩写
.
参数:
value:
待转化的整数。
radix:
是基数的意思
,
即先将
value
转化为
radix
进制的数,范围介于
2-36
,比如
10
表示
10
进制,
16
表示
16
进制。
* string:
保存转换后得到的字符串。
返回值:
char * :
指向生成的字符串,
同
*string
。
备注
:
该函数的头文件是
"stdlib.h"
itoa
功 能:把一整数转换为字符串
用 法:char *itoa(int value, char *string, int radix);
详细解释:itoa是英文integer to array(将int整型数转化为一个字符串,并将值保存在数组string中)的缩写.
参数:
value: 待转化的整数。
radix: 是基数的意思,即先将value转化为radix进制的数,范围介于2-36,比如10表示10进制,16表示16进制。
* string: 保存转换后得到的字符串。
返回值: char * : 指向生成的字符串, 同*string。
备注:该函数的头文件是"stdlib.h"
atoi
C语言库函数名: atoi
功 能: 把字符串转换成整型数.
名字来源:array to integer 的缩写.
函数说明: atoi()会扫描参数nptr字符串,如果第一个字符不是数字也不是正负号返回零,否则开始做类型转换,之后检测到非数字或结束符 \0 时停止转换,返回整型数。
以上库函数有可能在某些操作系统或者环境中不可使用,我们按照函数说明自己实现一份代码便可。
********************************************************************************************************************
以下是网络中挑选的atoi和itoa的实现模板
********************************************************************************************************************
1, atoi
原型: int atoi(const char *nptr);
函数说明: 参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。
#include
#include
static int atoi(const char* str)
{
int result = 0;
int sign = 0;
assert(str != NULL);
// proc whitespace characters
while (*str==' ' || *str=='\t' || *str=='\n')
++str;
// proc sign character
if (*str=='-')
{
sign = 1;
++str;
}
else if (*str=='+')
{
++str;
}
// proc numbers
while (*str>='0' && *str<='9')
{
result = result*10 + *str - '0';
++str;
}
// return result
if (sign==1)
return -result;
else
return result;
}
2. itoa
char *itoa( int value, char *string,int radix);
原型说明:
value:欲转换的数据。
string:目标字符串的地址。
radix:转换后的进制数,可以是10进制、16进制等
char *itoa(int val, char *buf, unsigned radix)
{
char *p;
char *firstdig;
char temp;
unsigned digval;
p = buf;
if(val <0)
{
*p++ = '-';
val = (unsigned long)(-(long)val);
}
firstdig = p;
do{
digval = (unsigned)(val % radix);
val /= radix;
if (digval > 9)
*p++ = (char)(digval - 10 + 'a');
else
*p++ = (char)(digval + '0');
}while(val > 0);
*p-- = '\0 ';
do{
temp = *p;
*p = *firstdig;
*firstdig = temp;
--p;
++firstdig;
}while(firstdig < p);
return buf;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
DE>#include<stdio.h>
int atoi(const char *str)
{
int value=0;
bool b_plus=true; //判断符号
switch(*str) //过滤符号
{
case '+':
str++;
break;
case '-':
b_plus=false;
str++;
break;
default:
break;
}
while('\0' != *str)
{
value = (value*10)+(*str-'0');
str++;
}
if(!b_plus)
value=-value;
return value;
}
void main()
{
char str[]="-999";
int value=atoi(str);
printf("The result is:%d\n",value);
}
|
DE>#include<stdio.h>
void itoa(int value, char *str)
{
if (value < 0) //如果是负数,则str[0]='-',并把value取反(变成正整数)
{
str[0] = '-';
value = 0-value;
}
int i,j;
for(i=1; value > 0; i++,value/=10) //从value[1]开始存放value的数字字符,不过是逆序,等下再反序过来
str[i] = value%10+'0'; //将数字加上0的ASCII值(即'0')就得到该数字的ASCII值
for(j=i-1,i=1; j-i>=1; j--,i++) //将数字字符反序存放
{
str[i] = str[i]^str[j];
str[j] = str[i]^str[j];
str[i] = str[i]^str[j];
}
if(str[0] != '-') //如果不是负数,则需要把数字字符下标左移一位,即减1
{
for(i=0; str[i+1]!='\0'; i++)
str[i] = str[i+1];
str[i] = '\0';
}
}
void main()
{
int value = -1212345;
char str[10] = {'\0'}; //记得把str全填充为'\0'
itoa(value, str);
printf("The result is:%s\n", str);
}
|
阅读(2285) | 评论(0) | 转发(0) |