2014年2月27日 星期四

C 語言 函式-文字與數值之間的轉換 / C language function - string convert to ( is converted form) numeric

C 語言 函式-文字與數值之間的轉換

作者:許裕永 Darban

文字 (string) 與數值 (numeric) 之間的轉換 (convert) 是程式碼不可或缺的技巧,本文章列出常用的函式,並解釋這些函式的用法,讓讀者可以一方面學會函式的用法,也可以同時學會文字與基本資料型別之間的轉換。

標頭檔名稱:stdio.h
這個標頭檔提供的函式,可以讓我們把數值格式化成文字後,嵌在一大串文字中;也可以讓我們擷取嵌在一大串文字中的數值文字。雖然用起來有點難度,但實用性很高。

*_* 數值轉成文字 / numeric convert to string
1.          int sprintf ( char * str, const char * format, ... );
參數 / Parameters
A.         str
一個文字指標。用來儲存數值格式化後之文字,它必須有足夠的容量來避免產生錯誤。
B.         format
一個文字的字面值,用來表明數值格式化的方式。用法與 printf 相同。
C.         ...
用逗號隔開的值。用法與 printf 相同。
返回值 / return value
在格式化成功時會得到字元的總數,不包含文字最後面的空字元。
若得到負值,表示格式化失敗。

範例:
        int radius;
        printf("Please input the radius =>");
        scanf("%d", &radius);
       
        double area = radius * radius * 3.14159;
        char word[20];
        sprintf(word,"The area is %.2f.", area);
       
        printf("%s", word);
       

*_* 文字轉成數值 / string convert to numeric
1.          int sscanf ( const char * s, const char * format, ...);
參數 / Parameters
A.         s
一個文字指標。函式會從這個文字的內容中取得要轉換成數值的文字。
B.         format
一個文字的字面值,用來表明格式化的方式。用法與 printf 相同。
C.         ...
用逗號隔開的值。用法與 printf 相同。
返回值 / return value
在格式化成功時會得到轉換的總數量。
若得到負值,表示格式化失敗。

範例:
char data[]="8*5=40";
        int numberA,numberB,numberC;
        sscanf(data,"%d*%d=%d", &numberA, &numberB, &numberC);
       
        printf("The numbers are : %d\t%d\t%d.", numberA, numberB, numberC);

標頭檔:stdlib.h
這標頭檔提供文字型態的數字轉換成各種型別的數值,與前面在一串文字中擷取部份內容不同,請讀者自行參酌使用時機。

>-< 一個值的轉換
1.          double atof (const char* str);
2.          int atoi (const char * str);
3.          long int atol ( const char * str );
參數 / Parameter
A.         str
一個文字指標。函式會把這個文字的內容轉換成數值。
返迴值 / return value
依各函式的 return type 宣告。
範例:
        char word[]="85";
        int value = atoi(word);
        printf("The value is : %d.", value);


>-< 多個值的轉換
1.          double strtod (const char* str, char** endptr);
2.          long int strtol (const char* str, char** endptr, int base);
參數 / Parameter
A.         str
一串以空白間格的數字組成的文字指標。
B.         endptr
記錄目前讀取位置的指標的記憶體位址 (指標的指標)
C.         base
整數的進位方式。2 ,8, 10, 16。0為 10 進位。
返回值 / return value
依各函式的 return type 宣告。0 0.0 代表讀取失敗。
範例 A
        char word[]="85 100 850";
        char* e = word;
        while(1)
        {
                long int value = strtol(e, &e, 0);
                if(value == 0)
                        return;
                printf("%d\t", value);
        }

範例 B
若文字內容包含 0 ,不方便以 value == 0 為中斷迴圈的條件時,可改用此範例, end 為空格最後一次出現的位置。
        char word[]="85 0 100 850";
        char* e = word;
        char* end = strrchr(word, ' ');
       
        while(e <= end)
        {
                long int value = strtol(e, &e, 0);
                printf("%d\t", value);
        }

此種函式的用法較為複雜。但日後進入檔案存取時,有時後必須從檔案中讀取大量文字資料再加以分析。到時候會不會這個函式,差別就很大了。

沒有留言:

張貼留言