關於字符串與數字的轉化(C語言)

字符串轉化爲數字

面試例題3:使用庫函數將字符串轉換爲數字。

考點:C庫函數中字符串轉換爲數字的使用。

出現頻率:★★★★

解析

與上節數字轉換爲字符串類似,C/C++語言提供了幾個標準庫函數,可以將字符串轉換爲任意類型(整型、長整型、浮點型等)。以下列舉了各函數的方法及其說明。

atof():將字符串轉換爲雙精度浮點型值。

atoi():將字符串轉換爲整型值。

atol():將字符串轉換爲長整型值。

strtod():將字符串轉換爲雙精度浮點型值,並報告不能被轉換的所有剩餘數字。

strtol():將字符串轉換爲長整值,並報告不能被轉換的所有剩餘數字。

strtoul():將字符串轉換爲無符號長整型值,並報告不能被轉換的所有剩餘數字。

以下程序演示如何使用atoi ()函數和atof ()函數。

 

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";         //將要被轉換爲整型的字符串
9        char str_double[30] = "436.55";  //將要被轉換爲浮點型的字符串
10  
11       num_int = atoi(str_int);          //轉換爲整型值
12       num_double = atof(str_double);  //轉換爲浮點型值
13  
14       printf("num_int: %d/n", num_int);
15       printf("num_double: %lf/n", num_double);
16  
17       return 0;
18   }

輸出結果:

num_int: 435
num_double: 436.550000

面試例題4:不使用庫函數將字符串轉換爲數字。

考點:字符串轉換爲數字時,對相關ASCII碼的理解。

出現頻率:★★★★

解析

程序代碼如下:

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'))  //如果當前字符不是數字
16           {                       //則退出循環
17               break;
18           }
19           temp = temp * 10 + (*str - '0'); //如果當前字符是數字則計算數值
20           str++;      //移到下一個字符
21       }   
22       if (*ptr == '-')     //如果字符串是以"-"開頭,則轉換成其相反數
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);      //把字符串轉換成整型數
37      
38       cout << n << endl;
39  
40       return 0;
41   }

程序執行結果:

輸入:1234
輸出:1234
輸入:-1234
輸出:-1234
輸入:+1234
輸出: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位是尾數位。    .

 

發佈了16 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章