1. 程式人生 > >關於字串與數字的轉化(C語言)

關於字串與數字的轉化(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位是尾數位。    .