1. 程式人生 > >c/c++ 字串,字元轉數字,數字轉字元

c/c++ 字串,字元轉數字,數字轉字元

在C/C++語言中沒有專門的字串變數,通常用字元陣列來存放字串。字串是以“\0”作為結束符。C/C++提供了豐富的字串處理函式,下面列出了幾個最常用的函式。
  ● 字串輸出函式puts。
  ● 字串輸出函式gets。
  ● 字串連線函式strcat。
  ● 字串複製函式strcpy。
  ● 測字串長度函式strlen。
字串是面試的重點考查部分的相關知識,通過考查字串的相關知識可以考察程式設計師的程式設計規範以及程式設計習慣。並且其中包括了許多知識點,例如記憶體越界、指標與陣列操作等。許多公司在面試時會要求應聘者寫一段複製字串或字串子串操作的程式。本章列舉了一些與字串相關的面試題,有些題目要求較高的程式設計技巧。


1.1 數字與字串的轉化
應聘時經常出現數字與字串之間轉化的問題,面試官通過這類題目來考察應聘者能力,例如是否熟悉常用的庫函式,是否瞭解ASCII碼以及是否瞭解字串的儲存格式等。


1.1.1  數字轉化為字串
面試例題1:使用庫函式將數字轉換為字串。
考點:C庫函式中數字轉換為字串的使用。
出現頻率:★★★
解析
C語言提供了幾個標準庫函式,可以將任意型別(整型、長整型、浮點型等)的數字轉換為字串,下面列舉了各函式的方法及其說明。
  ● itoa():將整型值轉換為字串。
  ● ltoa():將長整型值轉換為字串。
  ● ultoa():將無符號長整型值轉換為字串。
  ● gcvt():將浮點型數轉換為字串,取四捨五入。
  ● ecvt():將雙精度浮點型值轉換為字串,轉換結果中不包含十進位制小數點。
  ● fcvt():指定位數為轉換精度,其餘同ecvt()。
還可以使用sprintf系列函式把數字轉換成字串,其比itoa()系列函式執行速度慢。下列程式演示瞭如何使用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指向的第一個記憶體存放負號。


1.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行)就能把數值大小計算出來,如果結果是負數,就加一個負號。
 
 
C++字串,數字相互轉換
 
一.將CString轉為CTime的幾種方法
CString   timestr   =   "2000年04月05日";  
  int   a,b,c   ;  
  sscanf(timestr.GetBuffer(timestr.GetLength()),"%d年%d月%d日",&a,&b,&c);  
  CTime   time(a,b,c,0,0,0);    




--------or - ---------------------


 CString   s("2001-8-29   19:06:23");  
  int   nYear,   nMonth,   nDate,   nHour,   nMin,   nSec;  
  sscanf(s,   "%d-%d-%d   %d:%d:%d",   &nYear,   &nMonth,   &nDate,   &nHour,   &nMin,   &nSec);  
  CTime   t(nYear,   nMonth,   nDate,   nHour,   nMin,   nSec);


---- or ------------------------
CString   timestr   =   "2000年04月05日";  
  int   year,month,day;  
  BYTE   tt[5];  
  //get   year  
  memset(tt,   0,   sizeof(tt));  
  tt[0]   =   timestr[0];  
  tt[1]   =   timestr[1];  
  tt[2]   =   timestr[2];  
  tt[3]   =   timestr[3];  
  year=   atoi((char   *)tt);  
   
  //get   month  
  memset(tt,   0,   sizeof(tt));  
  tt[0]   =   timestr[6];  
  tt[1]   =   timestr[7];  
  month   =   atoi((char   *)tt);  
   
  //get   day  
  memset(tt,   0,   sizeof(tt));  
  tt[0]   =   timestr[10];  
  tt[1]   =   timestr[11];  
   
  CTime   time(year,month,day,0,0,0);
從上面來看,很明顯使用sscanf()函式的優勢.
 
二.將CTIme轉換為CString的方法:
CTime  tmSCan = CTime::GetCurrentTime();
CString szTime = tmScan.Format("'%Y-%m-%d %H:%M:%S'");
這樣得到的日期時間字串就是以"2006-11-27 23:30:59"的格式.這是不是很方便呢?
 //取得CTime中的日期
 CString cstrDate = tmScan.Format("%Y-%m-%d");
 //取得CTime中的時間
 CString cstrTime = tmScan.Format("%H:%M-%S");
          sprintf還有個不錯的表妹:strftime,專門用於格式化時間字串的,用法跟她表哥很像,也是一大堆格式控制符,只是畢竟小姑娘家心細,她還要呼叫者指定緩衝區的最大長度,可能是為了在出現問題時可以推卸責任吧。這裡舉個例子:
 
 更多更好的sprintf()函式說明參考:《spirntf,你知道多少?》
http://blog.csdn.net/steedhorse/archive/2005/03/25/330206.aspx
time_t t = time(0);
      //產生"YYYY-MM-DD hh:mm:ss"格式的字串。
char s[32];
strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));
sprintf在MFC中也能找到他的知音:CString::Format,strftime在MFC中自然也有她的同道:CTime::Format,這一對由於從面向物件哪裡得到了贊助,用以寫出的程式碼更覺優雅。
三,字串轉換為數值型別
將字串"20.0E6"轉換為數字
1,sscanf("20.0e5","%d",&x);
2,atof("20.0E6");
許多人用atoi(), atof() 和這個“家族”中的其它函式. 它們方便應用,但是有一個重要的缺點:
在轉換失敗和轉換字串"0"時都返回0, 這樣使得一致性錯誤檢查變得幾乎不可能。 為了完整性我們給出了小段程式碼:
 
程式碼:
--------------------------------------------------------------------------------
   const char* str_int = "777";
   const char* str_float = "333.3";
   int i = atoi(str_int);
   float f = atof(str_float);
--------------------------------------------------------------------------------


一個更好的辦法:
更有一點複雜, 更遺一致的辦法是利用sscanf()
程式碼:
--------------------------------------------------------------------------------
   const char* str_int = "777";
   const char* str_float = "333.3";
   int i;
   float f;
   if(EOF == sscanf(str_int, "%d", &i)){
      //錯誤
   }
   if(EOF == sscanf(str_float, "%f", &f)){
      //錯誤
   }
--------------------------------------------------------------------------------
Since sscanf() takes a const char* parameter, you can directly use a CString with it:
因為sscanf()用const char* 作為引數, 所以你可以直接用CString作引數:
程式碼:
--------------------------------------------------------------------------------
   CString str_int("777");
   if(EOF == sscanf(str_int, "%d", &i)){
      //error
   }
--------------------------------------------------------------------------------
小心格式描述符(如本例中的"%d")。 sscanf()沒有辦法檢查格式描述符與傳遞變數的型別匹配與否。如果不匹配你將得到不可預期的結果。 同樣注意sscanf()可以一次從字串中提取一個或多個數值。 詳細資訊請查閱MSDN。
 
C++ 方法


如下的例子展示了利用標準C++類的來完成這個任務的模板函式
程式碼:
--------------------------------------------------------------------------------
#include <string>
#include <sstream>
#include <iostream>
template <class T>
bool from_string(T &t,
                 const std::string &s,
                 std::ios_base & (*f)(std::ios_base&))
{
   std::istringstream iss(s);
   return !(iss>>f>>t).fail();
}
int main()
{
   int i;
   float f;
   // from_string()的第三個引數應為如下中的一個
   // one of std::hex, std::dec 或 std::oct
   if(from_string<int>(i, std::string("ff"), std::hex)){
      std::cout<<i<<std::endl;
   }
   else{
      std::cout<<"from_string failed"<<std::endl;
   }
   if(from_string<float>(f,
                               std::string("123.456"),
                               std::dec))
   {
      std::cout<<f<<std::endl;
   }
   else{
      std::cout<<"from_string failed"<<std::endl;
   }
   return 0;
}
 
四, int char * float and CString Covernt
1。 int <->CString
1) int ->CString
int n = 1;
CString str;
str.Format("%d",n);
2) CString->int
CString str = "1";
int n = atoi(str.GetBuffer(0));
2. char* 與CString
1)char*->CString
char sz[128];
CString str;
str.Format("%s",sz);
2) CString -> char*
CString str;
//int nLength = str.GetLength();
char* sz = str.GetBuffer(0);
3. float<->CString
1)float->CString
float f = 0.0;
CString str;
str.Format("%f",f);
2) CString->float
CString str = "0.0";
float f = atof(str.GetBuffer(0));

相關推薦

C語言字串高階處理(三)strspnstrcspnstrtok

高階字串查詢 strspn():函式返回字串STR1中第一個不包含於字串STR2的字元的索引或者理解為STR1包含STR2任一字元的字元長度。 strcspn():函式返回STR1開頭連續Ñ個字元都不含字串STR2內字元的字元數或者理解為STR1不包含STR2任一字元的字元長度。 的

C#中字串的一些常見函式比如string.Compare()

關於程式中常用到的string.compare(string A,string B),它的返回值是A與B的排序順序,返回值是一個整型int. 當值是 -1 的時候,A排在B之前; 當值是 0

c/c++ 字串字元數字數字字元

在C/C++語言中沒有專門的字串變數,通常用字元陣列來存放字串。字串是以“\0”作為結束符。C/C++提供了豐富的字串處理函式,下面列出了幾個最常用的函式。   ● 字串輸出函式puts。   ● 字串輸出函式gets。   ● 字串連線函式strcat。   ● 字串複製

C語言字串字元數字數字字元

在C/C++語言中沒有專門的字串變數,通常用字元陣列來存放字串。字串是以“/0”作為結束符。C/C++提供了豐富的字串處理函式,下面列出了幾個最常用的函式。   ● 字串輸出函式puts。   ● 字串輸出函式gets。   ● 字串連線函式strcat。   ●

LeetCode 8. String to Integer (atoi) C++ --字串轉為數字包含正負號、空格、字母、數字字元

Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cas

C語言:輸入一行字串統計出英文字母空格數字和其他字元的個數

題目要求 輸入一行字串統計出英文字母,空格,數字和其他字元的個數。 程式分析 要統計英文字母,空格,數字和其他字元的個數,則要遇到他們加一。 核心程式碼如下: while ((c=getchar())!='\n') { if ((c >= 'a' &

C語言之定義一個函式實現對字串做如下操作:當字元為字母時大小寫互換字元數字原樣輸出當有其它字元出現時結束操作返回已處理的字串

Action(){       char str[]={"tEst234%^road"};int len = sizeof(str)/sizeof(char);//strTest2呼叫函式lr_output_message("%s",strTest2(str,len)); r

C#List字串字串List字元陣列Int陣列字串string取某一位置字元

List轉字串 [C#] 純文字檢視 複製程式碼 01 02 List<string> List = new List<string>(); string strArray = string.Join(",", List

C 將一個單鏈表拆成3個迴圈連結串列其中一個是純數字一個純字母一個其他字元

前面相關操作在這呢,這個函式依託於此 //結構體 typedef struct Node { ElementType data; struct Node * next; } LNode, * LinkNode; //將一個單鏈表拆成3個迴圈連結串列,其中一個是純數字

C#基礎】輸入一個字元判定它是什麼型別的字元(大寫字母小寫字母數字或者其它字元

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _02_判斷使用者輸入字元型別 { c

C++查詢字串中同樣的字元並將其刪除不改變字串的順序。

輸入一個字串,找到相同的字元,將後面出現的字元刪除,不改變字串的順序。 例如: Hello    -》Helo 人山人海   -》人山海 程式碼實現: #include <iostream> #include<string>

C#字串陣列陣列字串後遍歷陣列

  string str = "1,2,3,4,5,6,7";             string[] strArray = str.Split(','); //字串轉

數字字元字串int陣列

1,舉例 字元字串轉成int陣列,存入int陣列,並進行遍歷。 Scanner input=new Scanner(System.in); System.out.println(“請輸入只含有大小寫的字串”); String string=input.next(

ACMNO.25 C語言-間隔輸出 寫一函式輸入一個四位數字要求輸出這四個數字字元但每兩個數字間空格。如輸入1990應輸出"1 9 9 0"。 輸入 一個四位數 輸出 增加空格輸出

題目描述 寫一函式,輸入一個四位數字,要求輸出這四個數字字元,但每兩個數字間空格。如輸入1990,應輸出"1 9 9 0"。 輸入 一個四位數 輸出 增加空格輸出 樣例輸入 1990 樣例輸出 1 9 9 0 來源/分類 C語言

C語言】ASCII碼的數字字母字母數字的方法

#include <stdio.h> int main(){ //輸入字母,再輸出字母的方法 printf("輸入字母,再輸出字母的方法\n"); char c1,c2; scanf("%c,%c",&

讀入一行字元(包括空格)做為一個字串的兩個方法 C/C++

        今天參加華為線上測試(OJ),前兩道題都做對了,最後一道我算出了結果,卻不知道如何輸出來,==         題目大概是要求輸入一行字元(字元為數字、負號、小數點、空格組成)作為一個字串,在字串中提取整數單元,每兩個整數單元用空格隔開了,整數單元包含負數。

在mySQl中SQL語言允許使用萬用字元進行字串匹配的操作其中“%”不能表示()。A.0個字元B.一個字元C.多個字元D.搜尋關鍵字中包含字元“%”

加粗樣式@TOC 歡迎使用Markdown編輯器 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。 新的改變 我們對Markdown編輯

C# 去除字串前0保留有效數字的解決方案

在做專案的時候為了讓編號看起來更霸氣,都加上了00,例如 10加了00 ,程式設計了0010,1加上了就程式設計0001了。 但新增的時候需要生成新的編號,要獲取最大的值,然後分離,再加1,再填充00,開始採用replace("0",""),將0全部替換為空,但這樣對於

c#輸入一個字串並把字串的第一個字元變為大寫如果字串中有空格則把空格的下個字元變為大寫之後輸出

using System; using System.Collections.Generic; using System.Text.RegularExpressions; delegate int MyDelegate();//相當於c函式指標 namespace c

c語言迴圈位移(數字字串

C語言中沒有提供迴圈移位的操作符,但可以通過簡潔的方式實現迴圈移位 設一個運算元x有s位則迴圈左移n位的操作為: (x << n) | (x >> (s - n)); 同理右移n位位: (x >> n) | (x << (s