C語言字串,字元轉數字,數字轉字元
在C/C++語言中沒有專門的字串變數,通常用字元陣列來存放字串。字串是以“/0”作為結束符。C/C++提供了豐富的字串處理函式,下面列出了幾個最常用的函式。
● 字串輸出函式puts。
● 字串輸出函式gets。
● 字串連線函式strcat。
● 字串複製函式strcpy。
● 測字串長度函式strlen。
字串是面試的重點考查部分的相關知識,通過考查字串的相關知識可以考察程式設計師的程式設計規範以及程式設計習慣。並且其中包括了許多知識點,例如記憶體越界、指標與陣列操作等。許多公司在面試時會要求應聘者寫一段複製字串或字串子串操作的程式。本章列舉了一些與字串相關的面試題,有些題目要求較高的程式設計技巧。
6.1 數字與字串的轉化
應聘時經常出現數字與字串之間轉化的問題,面試官通過這類題目來考察應聘者能力,例如是否熟悉常用的庫函式,是否瞭解ASCII碼以及是否瞭解字串的儲存格式等。
6.1.1 數字轉化為字串
面試例題1:使用庫函式將數字轉換為字串。
考點:C庫函式中數字轉換為字串的使用。
出現頻率:★★★
解析
C語言提供了幾個標準庫函式,可以將任意型別(整型、長整型、浮點型等)的數字轉換為字串,下面列舉了各函式的方法及其說明。
● itoa():將整型值轉換為字串。
● ltoa():將長整型值轉換為字串。
● ultoa():將無符號長整型值轉換為字串。
● gcvt():將浮點型數轉換為字串,取四捨五入。
● ecvt():將雙精度浮點型值轉換為字串,轉換結果中不包含十進位制小數點。
● fcvt():指定位數為轉換精度,其餘同ecvt()。
還可以使用sprintf系列函式把數字轉換成字串,其比itoa()系列函式執行速度慢。sprintf 最常見的應用之一莫過於把整數列印到字串中,所以,sprintf 在大多數場合可以替代itoa。sprintf(value, "%d", flag);
下列程式演示瞭如何使用itoa()函式和gcvt()函式:
1 # include <stdio.h>
2 # include <stdlib.h>
3
4 int main ()
5 {
6 int num_int = 435;
7 double num_double = 435.10f;
8 char str_int[30];
9 char str_double[30];
10
11 itoa(num_int, str_int, 10); //把整數num_int轉成字串str_int
12 gcvt(num_double, 8, str_double); //把浮點數num_double轉成字串str_double
13
14 printf("str_int: %s/n", str_int);
15 printf("str_double: %s/n", str_double);
16
17 return 0;
18 }
程式輸出結果:
1 str_int: 435
2 str_double: 435.10001
● 程式碼第11行中的引數10表示按十進位制型別進行轉換,轉換後的結果是“435”,如果按二進位制型別進行轉換,則結果為“1101110011”。
● 程式碼第12行中的引數8表示精確位數,這裡得到的結果是“435.10001”。
答案
可以使用atoi系列函式把數字轉換成字串。
面試例題2:不使用庫函式將整數轉換為字串。
考點:數字轉換為字串,理解相關ASCII碼。
出現頻率:★★★★
解析
如果不使用atoi或sprintf等庫函式,可以通過把整數的各位上的數字加“0”轉換成char型別並存到字元陣列中。但是要注意,需要採用字串逆序的方法。如以下程式所示:
1 #include <iostream>
2 using namespace std;
3
4 void int2str(int n, char *str)
5 {
6 char buf[10] = "";
7 int i = 0;
8 int len = 0;
9 int temp = n < 0 ? -n: n; // temp為n的絕對值
10
11 if (str == NULL)
12 {
13 return;
14 }
15 while(temp)
16 {
17 buf[i++] = (temp % 10) + '0'; //把temp的每一位上的數存入buf
18 temp = temp / 10;
19 }
20
21 len = n < 0 ? ++i: i; //如果n是負數,則多需要一位來儲存負號
22 str[i] = 0; //末尾是結束符0
23 while(1)
24 {
25 i--;
26 if (buf[len-i-1] ==0)
27 {
28 break;
29 }
30 str[i] = buf[len-i-1]; //把buf數組裡的字元拷到字串
31 }
32 if (i == 0 )
33 {
34 str[i] = '-'; //如果是負數,新增一個負號
35 }
36 }
37
38 int main()
39 {
40 int nNum;
41 char p[10];
42
43 cout << "Please input an integer:";
44 cin >> nNum;
45 cout << "output: " ;
46 int2str(nNum, p); //整型轉換成字串
47 cout<< p << endl;
48
49 return 0;
50 }
程式中的int2str函式完成了int型別到字串型別的轉換。在程式碼第46行對int2str函式做了測試。程式的執行結果如下所示:
Please input an integer: 1234
Output: 1234
如果輸入的是個負數,程式執行結果如下所示:
Please input an integer: -1234
Output: -1234
接下來對int2str函式的實現進行分析。
● 程式碼第9行,把引數n的絕對值賦給temp,以後在計算各個位的整數時用temp,這樣保證在負數情況下取餘不會出現問題。
● 程式碼第11~第14行判斷str的有效性,str不為NULL。
● 程式碼第15~第19行的while迴圈中,將n的各個位存放到區域性陣列buf中,存放的順序與整數順序相反。例如n為整數123 456,while迴圈結束後buf應為“654 321”。
● 程式碼第21行計算轉換後字串的長度len,如果是負數,長度應該再加1。
● 程式碼第22~第31行把陣列buf中的非0元素逆向複製到引數str指向的記憶體中,如果n是負數,則str指向的第一個記憶體存放負號。
6.1.2 字串轉化為數字
面試例題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行)就能把數值大小計算出來,如果結果是負數,就加一個負號。
字元0-9轉為數字
char a = '1';
int ca = a - '0';
結合使用 strcpy strcat sprintf做字元及字串操作