C.【转】C语言字符串与数字相互转换
1、gcvt 把浮點數(shù)轉(zhuǎn)成字符串 - CSDN博客.html(https://blog.csdn.net/dxuehui/article/details/52791412)
1.1、
函數(shù)名: gcvt 用 法: char *gcvt(double value, int ndigit, char *buf); 包含頭文件:<stdlib.h> 參數(shù) value——被轉(zhuǎn)換的值。 Digits——存儲的有效數(shù)字位數(shù)。 Buffe——結(jié)果的存儲位置。 返回值 返回一個指向結(jié)果的存儲位置的指針 #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; int main() {char str[50];gcvt(2561,5,str);cout<<"str: "<<str<<endl;char *ptr;ptr=gcvt(-145.67,5,str) ;cout<<"str: "<<ptr<<endl;char *str1;char str2[50];str1=str2;gcvt(-1256.3,6,str1);cout<<"str: "<<str1<<endl;}?
2、
3、C語言字符串與數(shù)字相互轉(zhuǎn)換 - stardsd - 博客園.html(https://www.cnblogs.com/sddai/p/5774121.html)
3.1、
在C/C++語言中沒有專門的字符串變量,通常用字符數(shù)組來存放字符串。字符串是以“\0”作為結(jié)束符。C/C++提供了豐富的字符串處理函數(shù),下面列出了幾個最常用的函數(shù)。
??● 字符串輸出函數(shù)puts。
??● 字符串輸出函數(shù)gets。
??● 字符串連接函數(shù)strcat。
??● 字符串復(fù)制函數(shù)strcpy。
??● 測字符串長度函數(shù)strlen。
字符串是面試的重點考查部分的相關(guān)知識,通過考查字符串的相關(guān)知識可以考察程序員的編程規(guī)范以及編程習(xí)慣。并且其中包括了許多知識點,例如內(nèi)存越界、指針與數(shù)組操作等。許多公司在面試時會要求應(yīng)聘者寫一段復(fù)制字符串或字符串子串操作的程序。本章列舉了一些與字符串相關(guān)的面試題,有些題目要求較高的編程技巧。
6.1??數(shù)字與字符串的轉(zhuǎn)化
應(yīng)聘時經(jīng)常出現(xiàn)數(shù)字與字符串之間轉(zhuǎn)化的問題,面試官通過這類題目來考察應(yīng)聘者能力,例如是否熟悉常用的庫函數(shù),是否了解ASCII碼以及是否了解字符串的存儲格式等。
6.1.1??數(shù)字轉(zhuǎn)化為字符串
面試例題1:使用庫函數(shù)將數(shù)字轉(zhuǎn)換為字符串。
考點:C庫函數(shù)中數(shù)字轉(zhuǎn)換為字符串的使用。
出現(xiàn)頻率:★★★
解析
C語言提供了幾個標準庫函數(shù),可以將任意類型(整型、長整型、浮點型等)的數(shù)字轉(zhuǎn)換為字符串,下面列舉了各函數(shù)的方法及其說明。
??● itoa():將整型值轉(zhuǎn)換為字符串。
??● ltoa():將長整型值轉(zhuǎn)換為字符串。
??● ultoa():將無符號長整型值轉(zhuǎn)換為字符串。
??● gcvt():將浮點型數(shù)轉(zhuǎn)換為字符串,取四舍五入。
??● ecvt():將雙精度浮點型值轉(zhuǎn)換為字符串,轉(zhuǎn)換結(jié)果中不包含十進制小數(shù)點。
??● fcvt():指定位數(shù)為轉(zhuǎn)換精度,其余同ecvt()。
還可以使用sprintf系列函數(shù)把數(shù)字轉(zhuǎn)換成字符串,其比itoa()系列函數(shù)運行速度慢。下列程序演示了如何使用itoa()函數(shù)和gcvt()函數(shù):
1????# include <stdio.h>
2????# include <stdlib.h>
3???
4????int main ()
5????{
6????????int num_int = 435;
7????????double num_double = 435.10f;
8????????char str_int[30];
9????????char str_double[30];
10??
11???????itoa(num_int, str_int, 10);??//把整數(shù)num_int轉(zhuǎn)成字符串str_int
12???????gcvt(num_double, 8, str_double);??//把浮點數(shù)num_double轉(zhuǎn)成字符串str_double
13??
14???????printf("str_int: %s\n", str_int);
15???????printf("str_double: %s\n", str_double);
16??
17???????return 0;
18???}
程序輸出結(jié)果:
1????str_int: 435
2????str_double: 435.10001
??● 代碼第11行中的參數(shù)10表示按十進制類型進行轉(zhuǎn)換,轉(zhuǎn)換后的結(jié)果是“435”,如果按二進制類型進行轉(zhuǎn)換,則結(jié)果為“1101110011”。
??● 代碼第12行中的參數(shù)8表示精確位數(shù),這里得到的結(jié)果是“435.10001”。
答案
可以使用atoi系列函數(shù)把數(shù)字轉(zhuǎn)換成字符串。
面試例題2:不使用庫函數(shù)將整數(shù)轉(zhuǎn)換為字符串。
考點:數(shù)字轉(zhuǎn)換為字符串,理解相關(guān)ASCII碼。
出現(xiàn)頻率:★★★★
解析
如果不使用atoi或sprintf等庫函數(shù),可以通過把整數(shù)的各位上的數(shù)字加“0”轉(zhuǎn)換成char類型并存到字符數(shù)組中。但是要注意,需要采用字符串逆序的方法。如以下程序所示:
1????#include <iostream>
2????using namespace std;
3???
4????void int2str(int n, char *str)
5????{
6????????char buf[10] = "";
7????????int i = 0;
8????????int len = 0;
9????????int temp = n < 0 ? -n: n;??// temp為n的絕對值
10??
11???????if (str == NULL)
12???????{
13???????????return;
14???????}
15???????while(temp)
16???????{
17???????????buf[i++] = (temp % 10) + '0';??//把temp的每一位上的數(shù)存入buf
18???????????temp = temp / 10;
19???????}
20??
21???????len = n < 0 ? ++i: i;??//如果n是負數(shù),則多需要一位來存儲負號
22???????str[i] = 0;????????????//末尾是結(jié)束符0
23???????while(1)
24???????{
25???????????i--;
26???????????if (buf[len-i-1] ==0)
27???????????{
28???????????????break;
29???????????}
30???????????str[i] = buf[len-i-1];??//把buf數(shù)組里的字符拷到字符串
31???????}
32???????if (i == 0 )
33???????{
34???????????str[i] = '-';??????????//如果是負數(shù),添加一個負號
35???????}
36???}
37??
38???int main()
39???{
40???????int nNum;
41???????char p[10];
42??
43???????cout << "Please input an integer:";
44???????cin >> nNum;
45???????cout << "output: " ;
46???????int2str(nNum, p);????????//整型轉(zhuǎn)換成字符串
47???????cout<< p << endl;
48??
49???????return 0;
50???}
程序中的int2str函數(shù)完成了int類型到字符串類型的轉(zhuǎn)換。在代碼第46行對int2str函數(shù)做了測試。程序的執(zhí)行結(jié)果如下所示:
Please input an integer: 1234
Output: 1234
如果輸入的是個負數(shù),程序執(zhí)行結(jié)果如下所示:
Please input an integer: -1234
Output: -1234
接下來對int2str函數(shù)的實現(xiàn)進行分析。
??● 代碼第9行,把參數(shù)n的絕對值賦給temp,以后在計算各個位的整數(shù)時用temp,這樣保證在負數(shù)情況下取余不會出現(xiàn)問題。
??● 代碼第11~第14行判斷str的有效性,str不為NULL。
??● 代碼第15~第19行的while循環(huán)中,將n的各個位存放到局部數(shù)組buf中,存放的順序與整數(shù)順序相反。例如n為整數(shù)123?456,while循環(huán)結(jié)束后buf應(yīng)為“654?321”。
??● 代碼第21行計算轉(zhuǎn)換后字符串的長度len,如果是負數(shù),長度應(yīng)該再加1。
??● 代碼第22~第31行把數(shù)組buf中的非0元素逆向復(fù)制到參數(shù)str指向的內(nèi)存中,如果n是負數(shù),則str指向的第一個內(nèi)存存放負號。
6.1.2??字符串轉(zhuǎn)化為數(shù)字
面試例題3:使用庫函數(shù)將字符串轉(zhuǎn)換為數(shù)字。
考點:C庫函數(shù)中字符串轉(zhuǎn)換為數(shù)字的使用。
出現(xiàn)頻率:★★★★
解析
與上節(jié)數(shù)字轉(zhuǎn)換為字符串類似,C/C++語言提供了幾個標準庫函數(shù),可以將字符串轉(zhuǎn)換為任意類型(整型、長整型、浮點型等)。以下列舉了各函數(shù)的方法及其說明。
??● atof():將字符串轉(zhuǎn)換為雙精度浮點型值。
??● atoi():將字符串轉(zhuǎn)換為整型值。
??● atol():將字符串轉(zhuǎn)換為長整型值。
??● strtod():將字符串轉(zhuǎn)換為雙精度浮點型值,并報告不能被轉(zhuǎn)換的所有剩余數(shù)字。
??● strtol():將字符串轉(zhuǎn)換為長整值,并報告不能被轉(zhuǎn)換的所有剩余數(shù)字。
??● strtoul():將字符串轉(zhuǎn)換為無符號長整型值,并報告不能被轉(zhuǎn)換的所有剩余數(shù)字。
以下程序演示如何使用atoi ()函數(shù)和atof ()函數(shù)。
1????# include <stdio.h>
2????# include <stdlib.h>
3???
4????int main ()
5????{
6????????int num_int;
7????????double num_double;
8????????char str_int[30] = "435";?????????//將要被轉(zhuǎn)換為整型的字符串
9????????char str_double[30] = "436.55";??//將要被轉(zhuǎn)換為浮點型的字符串
10??
11???????num_int = atoi(str_int);??????????//轉(zhuǎn)換為整型值
12???????num_double = atof(str_double);??//轉(zhuǎn)換為浮點型值
13??
14???????printf("num_int: %d\n", num_int);
15???????printf("num_double: %lf\n", num_double);
16??
17???????return 0;
18???}
輸出結(jié)果:
num_int: 435
num_double: 436.550000
面試例題4:不使用庫函數(shù)將字符串轉(zhuǎn)換為數(shù)字。
考點:字符串轉(zhuǎn)換為數(shù)字時,對相關(guān)ASCII碼的理解。
出現(xiàn)頻率:★★★★
解析
程序代碼如下:
1????#include <iostream>
2????using namespace std;
3???
4????int str2int(const char *str)
5????{
6????????int temp = 0;
7????????const char *ptr = str;??//ptr保存str字符串開頭
8???
9????????if (*str == '-' || *str == '+')??//如果第一個字符是正負號,
10???????{??????????????????????//則移到下一個字符
11???????????str++;
12???????}
13???????while(*str != 0)
14???????{
15???????????if ((*str < '0') || (*str > '9'))??//如果當前字符不是數(shù)字
16???????????{???????????????????????//則退出循環(huán)
17???????????????break;
18???????????}
19???????????temp = temp * 10 + (*str - '0'); //如果當前字符是數(shù)字則計算數(shù)值
20???????????str++;??????//移到下一個字符
21???????}???
22???????if (*ptr == '-')?????//如果字符串是以“-”開頭,則轉(zhuǎn)換成其相反數(shù)
23???????{
24???????????temp = -temp;
25???????}
26??
27???????return temp;
28???}
29??
30???int main()
31???{
32???????int n = 0;???
33???????char p[10] = "";
34??
35???????cin.getline(p, 20);???//從終端獲取一個字符串
36???????n = str2int(p);??????//把字符串轉(zhuǎn)換成整型數(shù)
37???????
38???????cout << n << endl;
39??
40???????return 0;
41???}
程序執(zhí)行結(jié)果:
輸入:1234
輸出:1234
輸入:-1234
輸出:-1234
輸入:+1234
輸出:1234
程序中的str2int函數(shù)作用是將字符串轉(zhuǎn)換成整數(shù)。這個函數(shù)的轉(zhuǎn)換過程與例題2中的int2str函數(shù)相比更加簡單,它只需要做一次while循環(huán)(代碼第13行)就能把數(shù)值大小計算出來,如果結(jié)果是負數(shù),就加一個負號。
?
?
?
?
?
C++字符串,數(shù)字相互轉(zhuǎn)換
?
一.將CString轉(zhuǎn)為CTime的幾種方法
CString ??timestr ??= ??"2000年04月05日"; ?
??int ??a,b,c ??; ?
??sscanf(timestr.GetBuffer(timestr.GetLength()),"%d年%d月%d日",&a,&b,&c); ?
??CTime ??time(a,b,c,0,0,0);????
--------or - ---------------------
?CString ??s("2001-8-29 ??19:06:23"); ?
??int ??nYear, ??nMonth, ??nDate, ??nHour, ??nMin, ??nSec; ?
??sscanf(s, ??"%d-%d-%d ??%d:%d:%d", ??&nYear, ??&nMonth, ??&nDate, ??&nHour, ??&nMin, ??&nSec); ?
??CTime ??t(nYear, ??nMonth, ??nDate, ??nHour, ??nMin, ??nSec);
---- or ------------------------
CString ??timestr ??= ??"2000年04月05日"; ?
??int ??year,month,day; ?
??BYTE ??tt[5]; ?
??//get ??year ?
??memset(tt, ??0, ??sizeof(tt)); ?
??tt[0] ??= ??timestr[0]; ?
??tt[1] ??= ??timestr[1]; ?
??tt[2] ??= ??timestr[2]; ?
??tt[3] ??= ??timestr[3]; ?
??year= ??atoi((char ??*)tt); ?
???
??//get ??month ?
??memset(tt, ??0, ??sizeof(tt)); ?
??tt[0] ??= ??timestr[6]; ?
??tt[1] ??= ??timestr[7]; ?
??month ??= ??atoi((char ??*)tt); ?
???
??//get ??day ?
??memset(tt, ??0, ??sizeof(tt)); ?
??tt[0] ??= ??timestr[10]; ?
??tt[1] ??= ??timestr[11]; ?
???
??CTime ??time(year,month,day,0,0,0);
從上面來看,很明顯使用sscanf()函數(shù)的優(yōu)勢.
?
二.將CTIme轉(zhuǎn)換為CString的方法:
CTime??tmSCan =?CTime::GetCurrentTime();
CString szTime = tmScan.Format("'%Y-%m-%d %H:%M:%S'");
這樣得到的日期時間字符串就是以"2006-11-27 23:30:59"的格式.這是不是很方便呢?
?//取得CTime中的日期
?CString cstrDate = tmScan.Format("%Y-%m-%d");
?//取得CTime中的時間
?CString cstrTime = tmScan.Format("%H:%M-%S");
??????????sprintf還有個不錯的表妹:strftime,專門用于格式化時間字符串的,用法跟她表哥很像,也是一大堆格式控制符,只是畢竟小姑娘家心細,她還要調(diào)用者指定緩沖區(qū)的最大長度,可能是為了在出現(xiàn)問題時可以推卸責任吧。這里舉個例子:
?
?更多更好的sprintf()函數(shù)說明參考:《spirntf,你知道多少?》
http://blog.csdn.net/steedhorse/archive/2005/03/25/330206.aspx
time_t t = time(0);
??????//產(chǎn)生"YYYY-MM-DD hh:mm:ss"格式的字符串。
char s[32];
strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));
sprintf在MFC中也能找到他的知音:CString::Format,strftime在MFC中自然也有她的同道:CTime::Format,這一對由于從面向?qū)ο竽睦锏玫搅速澲?#xff0c;用以寫出的代碼更覺優(yōu)雅。
三,字符串轉(zhuǎn)換為數(shù)值類型
將字符串"20.0E6"轉(zhuǎn)換為數(shù)字
1,sscanf("20.0e5","%d",&x);
2,atof("20.0E6");
許多人用atoi(), atof() 和這個“家族”中的其它函數(shù). 它們方便應(yīng)用,但是有一個重要的缺點:
在轉(zhuǎn)換失敗和轉(zhuǎn)換字符串"0"時都返回0, 這樣使得一致性錯誤檢查變得幾乎不可能。 為了完整性我們給出了小段代碼:
?
代碼:
--------------------------------------------------------------------------------
???const char* str_int = "777";
???const char* str_float = "333.3";
???int i = atoi(str_int);
???float f = atof(str_float);
--------------------------------------------------------------------------------
一個更好的辦法:
更有一點復(fù)雜, 更遺一致的辦法是利用sscanf()
代碼:
--------------------------------------------------------------------------------
???const char* str_int = "777";
???const char* str_float = "333.3";
???int i;
???float f;
???if(EOF == sscanf(str_int, "%d", &i)){
??????//錯誤
???}
???if(EOF == sscanf(str_float, "%f", &f)){
??????//錯誤
???}
--------------------------------------------------------------------------------
Since sscanf() takes a const char* parameter, you can directly use a CString with it:
因為sscanf()用const char* 作為參數(shù), 所以你可以直接用CString作參數(shù):
代碼:
--------------------------------------------------------------------------------
???CString str_int("777");
???if(EOF == sscanf(str_int, "%d", &i)){
??????//error
???}
--------------------------------------------------------------------------------
小心格式描述符(如本例中的"%d")。 sscanf()沒有辦法檢查格式描述符與傳遞變量的類型匹配與否。如果不匹配你將得到不可預(yù)期的結(jié)果。 同樣注意sscanf()可以一次從字符串中提取一個或多個數(shù)值。 詳細信息請查閱MSDN。
?
C++ 方法
如下的例子展示了利用標準C++類的來完成這個任務(wù)的模板函數(shù)
代碼:
--------------------------------------------------------------------------------
#include <string>
#include <sstream>
#include <iostream>
template <class T>
bool from_string(T &t,
?????????????????const std::string &s,
?????????????????std::ios_base & (*f)(std::ios_base&))
{
???std::istringstream iss(s);
???return !(iss>>f>>t).fail();
}
int main()
{
???int i;
???float f;
???// from_string()的第三個參數(shù)應(yīng)為如下中的一個
???// one of std::hex, std::dec 或 std::oct
???if(from_string<int>(i, std::string("ff"), std::hex)){
??????std::cout<<i<<std::endl;
???}
???else{
??????std::cout<<"from_string failed"<<std::endl;
???}
???if(from_string<float>(f,
???????????????????????????????std::string("123.456"),
???????????????????????????????std::dec))
???{
??????std::cout<<f<<std::endl;
???}
???else{
??????std::cout<<"from_string failed"<<std::endl;
???}
???return 0;
}
?
四,?int char * float and CString?Covernt
1。 int <->CString
1) int ->CString
int n = 1;
CString str;
str.Format("%d",n);
2) CString->int
CString str = "1";
int n = atoi(str.GetBuffer(0));
2. char* 與CString
1)char*->CString
char sz[128];
CString str;
str.Format("%s",sz);
2) CString -> char*
CString str;
//int nLength = str.GetLength();
char* sz = str.GetBuffer(0);
3. float<->CString
1)float->CString
float f = 0.0;
CString str;
str.Format("%f",f);
2) CString->float
CString str = "0.0";
float f = atof(str.GetBuffer(0));
分類:?C++,C語言4、
5、
6、
7、
8、
?
轉(zhuǎn)載于:https://www.cnblogs.com/cppskill/p/9105542.html
總結(jié)
以上是生活随笔為你收集整理的C.【转】C语言字符串与数字相互转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj3111 选取物品(二分+贪心)
- 下一篇: 美团笔试最大矩形面积