Play Open
Loading Please wait Loading Please wait Loading Please wait Loading Please wait Loading Please wait Loading Please wait

C语言 整数与字符串的相互转换

大家好,又见面了,我是你们的朋友全栈君。

C语言 整数与字符串的相互转换一、简述

C语言中整数与字符串的相互转换,有广泛应用的拓展函数(非标准库),也可以自己尝试简单的实现。

二、整数转字符串

1、拓展函数itoa

itoa (表示 integer to alphanumeric)是把整型数转换成字符串的一个函数。

windows环境下,在头文件中有

代码语言:javascript复制char* itoa(int value,char*string,int radix);//value: 要转换的整数,string: 转换后的字符串,radix: 转换进制数,如2,8,10,16 进制等。函数源码:

代码语言:javascript复制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;//返回转换后的字符串

}示例程序:

代码语言:javascript复制#include

#include

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、自己简单实现

实现代码

代码语言:javascript复制#include

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

{

//对称交换两端的值 其实就是省下中间变量交换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环境下,在头文件中

代码语言:javascript复制int atoi(const char *nptr);//字符串转整数函数,nptr: 要转换的字符串源码:

代码语言:javascript复制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;

}示例程序:

代码语言:javascript复制#include

#include

int main()

{

printf("字符串\"123456\"转换为数字:%d\n",atoi("123456"));

printf("字符串\"-123456\"转换为数字:%d\n",atoi("-123456"));

return 0;

} 效果截图:

2、自己简单实现

实现源码

代码语言:javascript复制#include

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>='0' && *str<='9')//如果是数字才进行转换,数字0~9的ASCII码:48~57

{

res = 10*res+ *str++ - '0';//字符'0'的ASCII码为48,48-48=0刚好转化为数字0

}

if(flag == '-')//处理是负数的情况

{

res = -res;

}

return (int)res;

}截图

四、利用sprintf()函数和sscanf()函数

整数转字符串

测试代码:

代码语言:javascript复制#include

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;

} 运行结果:

字符串转整数

测试代码:

代码语言:javascript复制#include

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134832.html原文链接:https://javaforall.cn

Copyright © 2088 神之降临者-硬核动作游戏门户 All Rights Reserved.
友情链接