網(wǎng)站建設(shè)總體方案設(shè)計(jì)下載優(yōu)化大師app
C語言 整數(shù)與字符串的相互轉(zhuǎn)換
一、簡述
????C語言中整數(shù)與字符串的相互轉(zhuǎn)換,有廣泛應(yīng)用的拓展函數(shù)(非標(biāo)準(zhǔn)庫),也可以自己嘗試簡單的實(shí)現(xiàn)。
二、整數(shù)轉(zhuǎn)字符串
????1、拓展函數(shù)itoa
????itoa (表示 integer to alphanumeric)是把整型數(shù)轉(zhuǎn)換成字符串的一個函數(shù)。
? ? ? windows環(huán)境下,在<stdlib.h>頭文件中有
char* itoa(int value,char*string,int radix);//value: 要轉(zhuǎn)換的整數(shù),string: 轉(zhuǎn)換后的字符串,radix: 轉(zhuǎn)換進(jìn)制數(shù),如2,8,10,16 進(jìn)制等。
函數(shù)源碼:
char* itoa(int num,char* str,int radix)
{char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//索引表unsigned unum;//存放要轉(zhuǎn)換的整數(shù)的絕對值,轉(zhuǎn)換的整數(shù)可能是負(fù)數(shù)int i=0,j,k;//i用來指示設(shè)置字符串相應(yīng)位,轉(zhuǎn)換之后i其實(shí)就是字符串的長度;轉(zhuǎn)換后順序是逆序的,有正負(fù)的情況,k用來指示調(diào)整順序的開始位置;j用來指示調(diào)整順序時的交換。//獲取要轉(zhuǎn)換的整數(shù)的絕對值if(radix==10&&num<0)//要轉(zhuǎn)換成十進(jìn)制數(shù)并且是負(fù)數(shù){unum=(unsigned)-num;//將num的絕對值賦給unumstr[i++]='-';//在字符串最前面設(shè)置為'-'號,并且索引加1}else unum=(unsigned)num;//若是num為正,直接賦值給unum//轉(zhuǎn)換部分,注意轉(zhuǎn)換后是逆序的do{str[i++]=index[unum%(unsigned)radix];//取unum的最后一位,并設(shè)置為str對應(yīng)位,指示索引加1unum/=radix;//unum去掉最后一位}while(unum);//直至unum為0退出循環(huán)str[i]='\0';//在字符串最后添加'\0'字符,c語言字符串以'\0'結(jié)束。//將順序調(diào)整過來if(str[0]=='-') k=1;//如果是負(fù)數(shù),符號不用調(diào)整,從符號后面開始調(diào)整else k=0;//不是負(fù)數(shù),全部都要調(diào)整char temp;//臨時變量,交換兩個值時用到for(j=k;j<=(i-1)/2;j++)//頭尾一一對稱交換,i其實(shí)就是字符串的長度,索引最大值比長度少1{temp=str[j];//頭部賦值給臨時變量str[j]=str[i-1+k-j];//尾部賦值給頭部str[i-1+k-j]=temp;//將臨時變量的值(其實(shí)就是之前的頭部值)賦給尾部}return str;//返回轉(zhuǎn)換后的字符串
}
示例程序:
#include <stdlib.h>
#include <stdio.h>
int main()
{int number1 = 123456;int number2 = -123456;char string[16] = {0};itoa(number1,string,10);printf("數(shù)字:%d 轉(zhuǎn)換后的字符串為:%s\n",number1,string);itoa(number2,string,10);printf("數(shù)字:%d 轉(zhuǎn)換后的字符串為:%s\n",number2,string);return 0;
}
效果截圖:
2、自己簡單實(shí)現(xiàn)
實(shí)現(xiàn)代碼
#include <stdio.h>char* Int2String(int num,char *str);//函數(shù)聲明
int main()
{int number1 = 123456;int number2 = -123456;char string[16] = {0};Int2String(number1,string);printf("數(shù)字:%d 轉(zhuǎn)換后的字符串為:%s\n",number1,string);Int2String(number2,string);printf("數(shù)字:%d 轉(zhuǎn)換后的字符串為:%s\n",number2,string);return 0;
}char* Int2String(int num,char *str)//10進(jìn)制
{int i = 0;//指示填充str if(num<0)//如果num為負(fù)數(shù),將num變正 {num = -num;str[i++] = '-';} //轉(zhuǎn)換 do{str[i++] = num%10+48;//取num最低位 字符0~9的ASCII碼是48~57;簡單來說數(shù)字0+48=48,ASCII碼對應(yīng)字符'0' num /= 10;//去掉最低位 }while(num);//num不為0繼續(xù)循環(huán)str[i] = '\0';//確定開始調(diào)整的位置 int j = 0;if(str[0]=='-')//如果有負(fù)號,負(fù)號不用調(diào)整 {j = 1;//從第二位開始調(diào)整 ++i;//由于有負(fù)號,所以交換的對稱軸也要后移1位 }//對稱交換 for(;j<i/2;j++){//對稱交換兩端的值 其實(shí)就是省下中間變量交換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;//返回轉(zhuǎn)換后的值
}
效果截圖
三、字符串轉(zhuǎn)整數(shù)
1、拓展函數(shù)
? ? ? ? ? ? atoi (表示 alphanumeric to integer)是把字符串轉(zhuǎn)換成整型數(shù)的一個函數(shù)。
? ? ? ? ? ? windows環(huán)境下,在<stdlib.h>頭文件中
int atoi(const char *nptr);//字符串轉(zhuǎn)整數(shù)函數(shù),nptr: 要轉(zhuǎn)換的字符串
源碼:
int atoi(const char *nptr)
{return (int)atol(nptr);
}long atol(const char *nptr)
{int c; /* 當(dāng)前要轉(zhuǎn)換的字符(一個一個字符轉(zhuǎn)換成數(shù)字) */long total; /* 當(dāng)前轉(zhuǎn)換結(jié)果 */int sign; /* 標(biāo)志轉(zhuǎn)換結(jié)果是否帶負(fù)號*//*跳過空格,空格不進(jìn)行轉(zhuǎn)換*/while ( isspace((int)(unsigned char)*nptr) )++nptr;c = (int)(unsigned char)*nptr++;//獲取一個字符準(zhǔn)備轉(zhuǎn)換 sign = c; /*保存符號標(biāo)示*/if (c == '-' || c == '+')c = (int)(unsigned char)*nptr++; /*跳過'+'、'-'號,不進(jìn)行轉(zhuǎn)換*/total = 0;//設(shè)置轉(zhuǎn)換結(jié)果為0 while (isdigit(c)) {//如果字符是數(shù)字 total = 10 * total + (c - '0'); /* 根據(jù)ASCII碼將字符轉(zhuǎn)換為對應(yīng)的數(shù)字,并且乘10累積到結(jié)果 */c = (int)(unsigned char)*nptr++; /* 取下一個字符 */}//根據(jù)符號指示返回是否帶負(fù)號的結(jié)果 if (sign == '-')return -total;elsereturn total;
}
示例程序:
#include<stdio.h>
#include<stdlib.h> int main()
{printf("字符串\"123456\"轉(zhuǎn)換為數(shù)字:%d\n",atoi("123456"));printf("字符串\"-123456\"轉(zhuǎn)換為數(shù)字:%d\n",atoi("-123456"));return 0;
}
效果截圖:
2、自己簡單實(shí)現(xiàn)
實(shí)現(xiàn)源碼
#include<stdio.h>int String2Int(char *str);//函數(shù)聲明
int main()
{printf("字符串\"123456\"轉(zhuǎn)換為數(shù)字:%d\n",String2Int("123456"));printf("字符串\"-123456\"轉(zhuǎn)換為數(shù)字:%d\n",String2Int("-123456"));return 0;
}int String2Int(char *str)//字符串轉(zhuǎn)數(shù)字
{char flag = '+';//指示結(jié)果是否帶符號 long res = 0;if(*str=='-')//字符串帶負(fù)號 {++str;//指向下一個字符 flag = '-';//將標(biāo)志設(shè)為負(fù)號 } //逐個字符轉(zhuǎn)換,并累加到結(jié)果res while(*str>='0' && *str<='9')//如果是數(shù)字才進(jìn)行轉(zhuǎn)換,數(shù)字0~9的ASCII碼:48~57 {res = 10*res+ *str++ - '0';//字符'0'的ASCII碼為48,48-48=0剛好轉(zhuǎn)化為數(shù)字0 } if(flag == '-')//處理是負(fù)數(shù)的情況{res = -res;}return (int)res;
}
截圖
四、利用sprintf()函數(shù)和sscanf()函數(shù)? ??
? ? ? ?整數(shù)轉(zhuǎn)字符串
? ? ? ?測試代碼:
? ? ? ? ?
#include <stdio.h>char* Int2String(int num,char *str);//函數(shù)聲明
int main()
{int number1 = 123456;int number2 = -123456;char string[16] = {0};Int2String(number1,string);printf("數(shù)字:%d 轉(zhuǎn)換后的字符串為:%s\n",number1,string);Int2String(number2,string);printf("數(shù)字:%d 轉(zhuǎn)換后的字符串為:%s\n",number2,string);return 0;
}char* Int2String(int num,char *str)
{sprintf(str, "%d", num);return str;}
? ? ? ?運(yùn)行結(jié)果:
? ? ? ?字符串轉(zhuǎn)整數(shù)
? ? ? ?測試代碼:
#include<stdio.h>int String2Int(char *str);//函數(shù)聲明
int main()
{printf("字符串\"123456\"轉(zhuǎn)換為數(shù)字:%d\n",String2Int("123456"));printf("字符串\"-123456\"轉(zhuǎn)換為數(shù)字:%d\n",String2Int("-123456"));return 0;
}int String2Int(char *str)//字符串轉(zhuǎn)數(shù)字
{char flag = '+';//指示結(jié)果是否帶符號 long res = 0;if(*str=='-')//字符串帶負(fù)號 {++str;//指向下一個字符 flag = '-';//將標(biāo)志設(shè)為負(fù)號 } sscanf(str, "%ld", &res);if(flag == '-'){res = -res;}return (int)res;
}
? ? ? ?運(yùn)行結(jié)果:
? ? ? ?
五、附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 |