原链接:C语言 整数与字符串的相互转换
C语言 整数与字符串的相互转换
一、简述
C语言中整数与字符串的相互转换,有广泛应用的拓展函数(非标准库),也可以自己尝试简单的实现。
二、整数转字符串
1、拓展函数itoa
itoa (表示 integer to alphanumeric)是把整型数转换成字符串的一个函数。
windows环境下,在<stdlib.h>头文件中有
char* itoa(int value,char*string,int radix);//value: 要转换的整数,string: 转换后的字符串,radix: 转换进制数,如2,8,10,16 进制等。
函数源码:
-
char* itoa(int num,char* str,int radix)
-
{
-
char index[]=
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//索引表
-
unsigned unum;
//存放要转换的整数的绝对值,转换的整数可能是负数
-
int i=
0,j,k;
//i用来指示设置字符串相应位,转换之后i其实就是字符串的长度;转换后顺序是逆序的,有正负的情况,k用来指示调整顺序的开始位置;j用来指示调整顺序时的交换。
-
-
//获取要转换的整数的绝对值
-
if(radix==
10&&num<
0)
//要转换成十进制数并且是负数
-
{
-
unum=(
unsigned)-num;
//将num的绝对值赋给unum
-
str[i++]=
'-';
//在字符串最前面设置为'-'号,并且索引加1
-
}
-
else unum=(
unsigned)num;
//若是num为正,直接赋值给unum
-
-
//转换部分,注意转换后是逆序的
-
do
-
{
-
str[i++]=index[unum%(
unsigned)radix];
//取unum的最后一位,并设置为str对应位,指示索引加1
-
unum/=radix;
//unum去掉最后一位
-
-
}
while(unum);
//直至unum为0退出循环
-
-
str[i]=
'\0';
//在字符串最后添加'\0'字符,c语言字符串以'\0'结束。
-
-
//将顺序调整过来
-
if(str[
0]==
'-') k=
1;
//如果是负数,符号不用调整,从符号后面开始调整
-
else k=
0;
//不是负数,全部都要调整
-
-
char temp;
//临时变量,交换两个值时用到
-
for(j=k;j<=(i
-1)/
2;j++)
//头尾一一对称交换,i其实就是字符串的长度,索引最大值比长度少1
-
{
-
temp=str[j];
//头部赋值给临时变量
-
str[j]=str[i
-1+k-j];
//尾部赋值给头部
-
str[i
-1+k-j]=temp;
//将临时变量的值(其实就是之前的头部值)赋给尾部
-
}
-
-
return str;
//返回转换后的字符串
-
}
示例程序:
-
#include <stdlib.h>
-
#include <stdio.h>
-
int main()
-
{
-
int number1 =
123456;
-
int number2 =
-123456;
-
char
string[
16] = {
0};
-
itoa(number1,
string,
10);
-
printf(
"数字:%d 转换后的字符串为:%s\n",number1,
string);
-
itoa(number2,
string,
10);
-
printf(
"数字:%d 转换后的字符串为:%s\n",number2,
string);
-
return
0;
-
}
效果截图:
2、自己简单实现
实现代码
-
-
#include <stdio.h>
-
-
char* Int2String(int num,char *str);
//函数声明
-
int main()
-
{
-
int number1 =
123456;
-
int number2 =
-123456;
-
char
string[
16] = {
0};
-
Int2String(number1,
string);
-
printf(
"数字:%d 转换后的字符串为:%s\n",number1,
string);
-
Int2String(number2,
string);
-
printf(
"数字:%d 转换后的字符串为:%s\n",number2,
string);
-
return
0;
-
}
-
-
char* Int2String(int num,char *str)//10进制
-
{
-
int i =
0;
//指示填充str
-
if(num<
0)
//如果num为负数,将num变正
-
{
-
num = -num;
-
str[i++] =
'-';
-
}
-
//转换
-
do
-
{
-
str[i++] = num%
10+
48;
//取num最低位 字符0~9的ASCII码是48~57;简单来说数字0+48=48,ASCII码对应字符'0'
-
num /=
10;
//去掉最低位
-
}
while(num);
//num不为0继续循环
-
-
str[i] =
'\0';
-
-
//确定开始调整的位置
-
int j =
0;
-
if(str[
0]==
'-')
//如果有负号,负号不用调整
-
{
-
j =
1;
//从第二位开始调整
-
++i;
//由于有负号,所以交换的对称轴也要后移1位
-
}
-
//对称交换
-
for(;j<i/
2;j++)
-
{
-
//对称交换两端的值 其实就是省下中间变量交换a+b的值:a=a+b;b=a-b;a=a-b;
-
str[j] = str[j] + str[i
-1-j];
-
str[i
-1-j] = str[j] - str[i
-1-j];
-
str[j] = str[j] - str[i
-1-j];
-
}
-
-
return str;
//返回转换后的值
-
}
效果截图
三、字符串转整数
1、拓展函数
atoi (表示 alphanumeric to integer)是把字符串转换成整型数的一个函数。
windows环境下,在<stdlib.h>头文件中
int atoi(const char *nptr);//字符串转整数函数,nptr: 要转换的字符串
源码:
-
int atoi(const char *nptr)
-
{
-
return (
int)atol(nptr);
-
}
-
-
long atol(const char *nptr)
-
{
-
int c;
/* 当前要转换的字符(一个一个字符转换成数字) */
-
long total;
/* 当前转换结果 */
-
int sign;
/* 标志转换结果是否带负号*/
-
-
/*跳过空格,空格不进行转换*/
-
while (
isspace((
int)(
unsigned
char)*nptr) )
-
++nptr;
-
-
c = (
int)(
unsigned
char)*nptr++;
//获取一个字符准备转换
-
sign = c;
/*保存符号标示*/
-
if (c ==
'-' || c ==
'+')
-
c = (
int)(
unsigned
char)*nptr++;
/*跳过'+'、'-'号,不进行转换*/
-
-
total =
0;
//设置转换结果为0
-
-
while (
isdigit(c)) {
//如果字符是数字
-
total =
10 * total + (c -
'0');
/* 根据ASCII码将字符转换为对应的数字,并且乘10累积到结果 */
-
c = (
int)(
unsigned
char)*nptr++;
/* 取下一个字符 */
-
}
-
-
//根据符号指示返回是否带负号的结果
-
if (sign ==
'-')
-
return -total;
-
else
-
return total;
-
}
示例程序:
-
#include<stdio.h>
-
#include<stdlib.h>
-
-
int main()
-
{
-
printf(
"字符串\"123456\"转换为数字:%d\n",atoi(
"123456"));
-
printf(
"字符串\"-123456\"转换为数字:%d\n",atoi(
"-123456"));
-
return
0;
-
}
效果截图:
2、自己简单实现
实现源码
-
#include<stdio.h>
-
-
int String2Int(char *str);
//函数声明
-
int main()
-
{
-
printf(
"字符串\"123456\"转换为数字:%d\n",String2Int(
"123456"));
-
printf(
"字符串\"-123456\"转换为数字:%d\n",String2Int(
"-123456"));
-
return
0;
-
}
-
-
int String2Int(char *str)//字符串转数字
-
{
-
char flag =
'+';
//指示结果是否带符号
-
long res =
0;
-
-
if(*str==
'-')
//字符串带负号
-
{
-
++str;
//指向下一个字符
-
flag =
'-';
//将标志设为负号
-
}
-
//逐个字符转换,并累加到结果res
-
while(*str>=
48 && *str<
57)
//如果是数字才进行转换,数字0~9的ASCII码:48~57
-
{
-
res =
10*res+ *str++
-48;
//字符'0'的ASCII码为48,48-48=0刚好转化为数字0
-
}
-
-
if(flag ==
'-')
//处理是负数的情况
-
{
-
res = -res;
-
}
-
-
return (
int)res;
-
}
截图
四、利用sprintf()函数和sscanf()函数
整数转字符串
测试代码:
-
#include <stdio.h>
-
-
char* Int2String(int num,char *str);
//函数声明
-
int main()
-
{
-
int number1 =
123456;
-
int number2 =
-123456;
-
char
string[
16] = {
0};
-
Int2String(number1,
string);
-
printf(
"数字:%d 转换后的字符串为:%s\n",number1,
string);
-
Int2String(number2,
string);
-
printf(
"数字:%d 转换后的字符串为:%s\n",number2,
string);
-
return
0;
-
}
-
-
char* Int2String(int num,char *str)
-
{
-
sprintf(str,
"%d", num);
-
-
return str;
-
-
}
运行结果:
字符串转整数
测试代码:
-
#include<stdio.h>
-
-
int String2Int(char *str);
//函数声明
-
int main()
-
{
-
printf(
"字符串\"123456\"转换为数字:%d\n",String2Int(
"123456"));
-
printf(
"字符串\"-123456\"转换为数字:%d\n",String2Int(
"-123456"));
-
return
0;
-
}
-
-
int String2Int(char *str)//字符串转数字
-
{
-
char flag =
'+';
//指示结果是否带符号
-
long res =
0;
-
-
if(*str==
'-')
//字符串带负号
-
{
-
++str;
//指向下一个字符
-
flag =
'-';
//将标志设为负号
-
}
-
-
sscanf(str,
"%ld", &res);
-
if(flag ==
'-')
-
{
-
res = -res;
-
}
-
return (
int)res;
-
}
运行结果:
五、附ASCII码表(部分)
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |