關於字串與數字的轉化(C語言)
字串轉化為數字
面試例題3:使用庫函式將字串轉換為數字。
考點:C庫函式中字串轉換為數字的使用。
出現頻率:★★★★
解析
與上節數字轉換為字串類似,C/C++語言提供了幾個標準庫函式,可以將字串轉換為任意型別(整型、長整型、浮點型等)。以下列舉了各函式的方法及其說明。
atof():將字串轉換為雙精度浮點型值。
atoi():將字串轉換為整型值。
atol():將字串轉換為長整型值。
strtod():將字串轉換為雙精度浮點型值,並報告不能被轉換的所有剩餘數字。
strtol():將字串轉換為長整值,並報告不能被轉換的所有剩餘數字。
strtoul():將字串轉換為無符號長整型值,並報告不能被轉換的所有剩餘數字。
以下程式演示如何使用atoi ()函式和atof ()函式。
1 # include <stdio.h> |
輸出結果:
num_int: 435 |
面試例題4:不使用庫函式將字串轉換為數字。
考點:字串轉換為數字時,對相關ASCII碼的理解。
出現頻率:★★★★
解析
程式程式碼如下:
1 #include <iostream> |
程式執行結果:
輸入:1234 |
程式中的str2int函式作用是將字串轉換成整數。這個函式的轉換過程與例題2中的int2str函式相比更加簡單,它只需要做一次while迴圈(程式碼第13行)就能把數值大小計算出來,如果結果是負數,就加一個負號。
#########################################################################
gcvt
函式原型: char * gcvt(double value,int ndec,char *buf)
函式功能: 將數值value轉換為長度為ndec的字串
函式返回: 指向buf的指標
引數說明: value-要轉換的浮點數值,ndec-轉換後的長度
所屬檔案: <stdlib.h>
引數
value——被轉換的值。
Digits——儲存的有效數字位數。
Buffe——結果的儲存位置。
說明
gcvt函式把一個浮點值轉換成一個字串(包括一個小數點和可能的
符號位元組)並存儲該字串在buffer中。該buffer應足夠大以便容納轉換
的值加上結尾的空格字元,它是自動新增的。如果一個緩衝區的尺寸為
digits的尺寸+1,該函式覆蓋該緩衝區的末尾。這是因為轉換的字串包
括一個小數點以及可能包含符號和指數資訊。不提供上溢位。gcvt試圖
以十進位制格式產生digits數字,如果不可能,它以指數格式產生digits數字,
在轉換時可能截除尾部的0。
#include <stdlib.h>
#include <stdio.h>
int main()
{
char str[25];
double num;
int sig=5;
num=9.876;
gcvt(num,sig,str);
printf( "string=%s ",str);
num=-123.4567;
gcvt(num,sig,str);
printf( "string=%s ",str);
num=0.678e5;
gcvt(num,sig,str);
printf( "string=%s ",str);
return(0);
} .
ecvt
函式原型: char *ecvt(double value,int ndigIT,int *dec,int *sign)
函式功能: 將浮點數轉換為字串
函式返回: 轉換後的字串指標
引數說明: value-待轉換底浮點數,ndigIT-轉換後的字串長度
所屬檔案: <stdlib.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main()
{
char *string;
double value;
int dec,sign;
int ndig=10;
clrscr();
value=9.876;
string=ecvt(value,ndig,&dec,&sign);
printf( "string=%s dec=%d sign=%d ",string,dec,sign);
value=-123.45;
ndig= 15;
string=ecvt(value,ndig,&dec,&sign);
printf( "string=%s dec=%d sign=%d ",string,dec,sign);
value=0.6789e5;
ndig=5;
string=ecvt(value,ndig,&dec,&sign);
printf( "string=%s dec=%d sign=%d ",string,dec,sign);
return 0;
}
函式名稱: fcvt
函式原型: char *fcvt(double value,int ndigIT,int *dec,int *sign)
函式功能: 將浮點數變成一個字串
函式返回: 轉換後字串指標
引數說明: value-待轉換底浮點數,ndigIT-轉換後底字串長度
所屬檔案: <stdlib.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main()
{
char *string;
double value;
int dec,sign;
int ndig=10;
clrscr();
value=9.876;
string=fcvt(value,ndig,&dec,&sign);
printf( "string=%s dec=%d sign=%d ",string,dec,sign);
value=-123.45;
ndig=15;
string=ecvt(value,ndig,&dec,&sign);
printf( "string=%s dec=%d sign=%d ",string,dec,sign);
value=0.6789e5;
ndig=5;
string=fcvt(value,ndig,&dec,&sign);
printf( "string=%s dec=%d sign=%d ",string,dec,sign);
return 0;
} .
#####################################################################
注 atof()返回值是double型別
float 與double區別
從儲存結構和演算法上來講,double和float是一樣的,不一樣的地方僅僅是float是32位的,double是64位的,所以double能儲存更高的精度。
任何資料在記憶體中都是以二進位制(0或1)順序儲存的,每一個1或0被稱為1位,而在x86CPU上一個位元組是8位。比如一個16位(2位元組)的short int型變數的值是1000,那麼它的二進位制表達就是:00000011 11101000。由於Intel CPU的架構原因,它是按位元組倒序儲存的,那麼就因該是這樣:11101000 00000011,這就是定點數1000在記憶體中的結構。
目前C/C++編譯器標準都遵照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。下面是具體的規格:
````````符號位 階碼 尾數 長度
float 1 8 23 32
double 1 11 52 64
臨時數 1 15 64 80
由於通常C編譯器預設浮點數是double型的,下面以double為例:
共計64位,摺合8位元組。由最高到最低位分別是第63、62、61、……、0位:
最高位63位是符號位,1表示該數為負,0正;
62-52位,一共11位是指數位;
51-0位,一共52位是尾數位。 .