字符串轉化爲數字
面試例題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位是尾數位。 .