C語言字符串與數字之間的相互轉換

在C/C++語言中沒有專門的字符串變量,通常用字符數組來存放字符串。字符串是以“\0”作爲結束符。C/C++提供了豐富的字符串處理函數,下面列出了幾個最常用的函數。
● 字符串輸出函數 puts。
● 字符串輸出函數 gets。
● 字符串連接函數 strcat。
● 字符串複製函數 strcpy。
● 測字符串長度函數 strlen。
其中包括了許多知識點,例如內存越界、指針與數組操作等。
許多公司在面試時會要求應聘者寫一段複製字符串或字符串子串操作的程序。
6.1 數字與字符串的轉化
應聘時經常出現數字與字符串之間轉化的問題,面試官通過這類題目來考察應聘者能力,例如是否熟悉常用的庫函數,是否瞭解ASCII碼以及是否瞭解字符串的存儲格式等。
重點內容:使用庫函數將數字轉化爲字符串
面試例題1:使用庫函數將數字轉換爲字符串。
考點:C庫函數中數字轉換爲字符串的使用。
出現頻率:★★★
解析
C語言提供了幾個標準庫函數,可以將任意類型(整型、長整型、浮點型等)的數字轉換爲字符串,下面列舉了各函數的方法及其說明。
● itoa():將整型值轉換爲字符串。
itoa是一個可以將整數轉換爲字符串的函數,配合textout函數可以方便的輸出數字,使用方法如下:
用法:char *itoa(int value, char *string, int radix);
將整數value轉換成字符串存入string,
radix爲轉換時所用基數(保存到字符串中的數據的進制基數2、8、10、16)
● ltoa():將長整型值轉換爲字符串。
● ultoa():將無符號長整型值轉換爲字符串。
● gcvt():將浮點型數轉換爲字符串,取四捨五入。
● ecvt():將雙精度浮點型值轉換爲字符串,轉換結果中不包含十進制小數點。
● fcvt():指定位數爲轉換精度,其餘同ecvt()。
還可以使用sprintf系列函數把數字轉換成字符串,其比itoa()系列函數運行速度慢。下列程序演示瞭如何使用itoa()函數和gcvt()函數:
itoa()函數演示將長整型值轉換爲字符串:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int num_int=435; //整數型數據
    char str_int[30];
    itoa(num_int,str_int,10);
    printf("str_int: %s\n", str_int);
    return 0;
}

gcvt():將浮點型數轉換爲字符串,取四捨五入。gcvt()函數:
定義函數:char *gcvt(double number, size_t ndigits, char *buf);
函數說明:gcvt()用來將參數number 轉換成ASCII 碼字符串,
參數ndigits 表示顯示的位數。
gcvt()與ecvt()和fcvt()不同的地方在於,gcvt()所轉換後的字符串包含小數點或正負符號。
若轉換成功,轉換後的字符串會放在參數buf 指針所指的空間。
返回值:返回一字符串指針,此地址即爲buf 指針。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    double num_double=435.10f;//浮點型數據
    char str_double[30];
    gcvt(num_double,8,str_double);//把浮點數num_double轉換爲str_double
    printf("str_double: %s\n", str_double);
    return 0;
}

面試例題2:不使用庫函數將整數轉換爲字符串。
考點:數字轉換爲字符串,理解相關ASCII碼。
如果不使用atoi或sprintf等庫函數,可以通過把整數的各位上的數字加“0”轉換成char類型並存到字符數組中。但是要注意,需要採用字符串逆序的方法。如以下程序所示:
知識點補充:
C語言運算符中問號是條件運算符(與冒號組合)。該運算符是C語言中唯一一個三目運算符。

max = a>b ? a : b;   // 如果a>b,則max的值爲a,否則max的值爲b,也即取a與b中的較大者

如果不使用atoi或sprintf等庫函數,可以通過把整數的各位上的數字加“0”轉換成char類型並存到字符數組中。但是要注意,需要採用字符串逆序的方法。如以下程序所示:

#include <stdio.h>
#include <stdlib.h>
void int2str(int n, char *str)
{
    char buf[10] = "";
    int i = 0;
    int len = 0;
    int temp = n < 0 ? -n: n;  // temp爲n的絕對值
    //把參數n的絕對值賦給temp,
    //以後在計算各個位的整數時用temp,這樣保證在負數情況下取餘不會出現問題。
    if (str == NULL)//判斷str的有效性,str不爲NULL。
    {
        return;
    }
    //while循環中,將n的各個位存放到局部數組buf中,存放的順序與整數順序相反。
    //例如n爲整數123 456,while循環結束後buf應爲“654 321”。
    while(temp)
    {
        buf[i++] = (temp % 10) + '0';  //把temp的每一位上的數存入buf
        temp = temp / 10;
    }
    len = n < 0 ? ++i: i;  //如果n是負數,則多需要一位來存儲負號
    str[i] = 0;            //末尾是結束符0
    while(1)
    {
        i--;
        if (buf[len-i-1] ==0)
        {
            break;
            //代碼第22~第31行把數組buf中的非0元素逆向複製到參數str指向的內存中,
            //如果n是負數,則str指向的第一個內存存放負號。
        }
        str[i] = buf[len-i-1];  //把buf數組裏的字符拷到字符串
    }
    if (i == 0 )
    {
        str[i] = '-';          //如果是負數,添加一個負號
    }
}
int main()
{
    int nNum=100;
    char p[10];
    int2str(nNum, p);        //整型轉換成字符串
    printf("p: %s\n", p);
    printf("%d",strlen(p)); //顯示3個字節
    return 0;
}

6.1.2 字符串轉化爲數字
面試例題3:使用庫函數將字符串轉換爲數字。
考點:C庫函數中字符串轉換爲數字的使用。
出現頻率:★★★★
解析
與上節數字轉換爲字符串類似,C/C++語言提供了幾個標準庫函數,可以將字符串轉換爲任意類型(整型、長整型、浮點型等)。以下列舉了各函數的方法及其說明。
● atof():將字符串轉換爲雙精度浮點型值。
● atoi():將字符串轉換爲整型值。
● atol():將字符串轉換爲長整型值。
● strtod():將字符串轉換爲雙精度浮點型值,並報告不能被轉換的所有剩餘數字。
● strtol():將字符串轉換爲長整值,並報告不能被轉換的所有剩餘數字。
● strtoul():將字符串轉換爲無符號長整型值,並報告不能被轉換的所有剩餘數字。
程序演示如何使用atoi ()函數和atof ()函數

#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int num_int;
    double num_double;
    char str_int[30] = "435";         //將要被轉換爲整型的字符串
    char str_double[30] = "436.55";  //將要被轉換爲浮點型的字符串
    num_int = atoi(str_int);          //轉換爲整型值
    num_double = atof(str_double);  //轉換爲浮點型值
    printf("num_int: %d\n", num_int);
    printf("num_double: %lf\n", num_double);
    return 0;
 }

面試例題4:不使用庫函數將字符串轉換爲數字。
考點:字符串轉換爲數字時,對相關ASCII碼的理解。
出現頻率:★★★★

#include <stdio.h>
#include <stdlib.h>
int str2int(const char *str)
{
    int temp = 0;
    const char *ptr = str;  //ptr保存str字符串開頭
    if (*str == '-' || *str == '+')  //如果第一個字符是正負號,
    {//則移到下一個字符
    str++;
    }
    while(*str != 0)
    {
        if ((*str < '0') || (*str > '9'))  //如果當前字符不是數字
        {                       //則退出循環
        break;
        }
        temp = temp * 10 + (*str - '0'); //如果當前字符是數字則計算數值
        str++;      //移到下一個字符
    }
    if (*ptr == '-')     //如果字符串是以“-”開頭,則轉換成其相反數
    {
        temp = -temp;
    }
    return temp;
}
int main()
{
    int n = 0;
    char p[10] = "1234";
    n = str2int(p);      //把字符串轉換成整型數
    printf("%d",n);
    return 0;
}

程序中的str2int函數作用是將字符串轉換成整數。這個函數的轉換過程與例題2中的int2str函數相比更加簡單,它只需要做一次while循環就能把數值大小計算出來,如果結果是負數,就加一個負號。
——這裏寫代碼片—-
參考網址:
1.http://www.cnblogs.com/sddai/p/5774121.html
2.http://blog.chinaunix.net/uid-11480268-id-2872719.html
3.http://www.jb51.net/article/71485.htm

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