1. 程式人生 > >【整理】C/C++中字串與整數之間的相互轉換

【整理】C/C++中字串與整數之間的相互轉換

最近刷題過程中總是碰到這個知識點,因此做個總結記錄一下。

一、用C標準IO庫中的sprintf()和sscanf()轉換 

sprintf()函式原型:

#include <stdio.h>
int sprintf(char *str,const char *format);
函式的功能是:將變數列印到字串中。(與printf的用法一致,區別僅在於sprintf()列印到字串,而printf()列印到標準輸出)

因此可利用sprintf()將數字轉換為字串。

sscanf()函式原型:

#include <stdio.h> 
int sprintf(char *str, const char *format, ...);
函式的功能是:將引數str的字串轉換成format對應的型別並將轉換後的結果存於對應的變數內。(與scanf用法一致,區別在於scanf()從標準輸入到引數,而sscanf從字串輸入到變數)

因此可利用sscanf()將字串轉換為數字。

示例程式碼:

#include <stdio.h>
#include <string.h>
int main(void)
{
	char str1[10]="1234321";
	char str2[10] = {};
	int a;
	//string --> int
	sscanf(str1,"%d",&a);
	printf("%d\n",a);
	//int -->string
	a = 987654;
	sprintf(str2,"%d",a);
	puts(str2);
	return 0;
}


二、用C++中的stringstream類轉換 

c++中的 <sstream>庫定義了三種類:istringstream、ostringstream和stringstream,分別用來進行流的輸入、輸出和輸入輸出操作。

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main(void)
{
	string str1="1234321";
	string str2;
	stringstream sstr;
	int a;
	//string --> int
	sstr << str1;
	sstr >> a;
	cout << a << endl;
	//int -->string
	sstr.clear();<span style="white-space:pre">	</span>//<span style="font-size: 13.3333px; font-family: Arial, Helvetica, sans-serif;">通過使用同一stringstream物件實現多種型別的轉換,每一次轉換之後都必須呼叫clear()成員函式。</span>
	a = 987654;
	sstr << a;
	sstr >> str2;
	cout << str2 <<endl;
	return 0;
}

在多次轉換中重複使用同一個stringstream(而不是每次都建立一個新的物件)物件最大的好處在於效率。stringstream物件的構造和解構函式通常是非常耗費CPU時間的。

三、atoi、atof、atol、itoa等

C標準庫<stdlib.h>提供了 atoi, atof, atol, atoll(C++11標準) 函式將字串轉換成int,double, long, long long 型。

而非標準函式itoa、litoa()、ultoa()可以將int、long、unsigned long型整數轉換為字串型別。

atoi()函式的的原型為:int atoi(const char *nptr);

itoa()函式的原型為:char *itoa( int value, char *string,int radix);//value:欲轉換的資料、string:目標字串的地址、radix:轉換後的進位制數,可以取10,16,8,2等

示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
	char str1[10]="1234321";
	char str2[10] = {};
	int a;
	//string --> int
	a = atoi(str1);
	printf("%d\n",a);
	//int -->string
	a = 987654;
	itoa(a,str2,10);
	puts(str2);
	return 0;
}

注意:itoa並不是一個標準的C函式,不能在所有的編譯器中使用,如果要寫跨平臺的程式,請用sprintf。

總結:三種方法的對比:

從效率對比來看:

下表是各種字串轉數字函式對同一組(10萬個)隨機數字字串的處理時間:

Method                          PerfCount
[int] _tstoi()                  34,802
[int] _stscanf()                233,264
[int] std::stringstream         1,553,689

[double] _tstof()               317,463
[double] _stscanf()             821,332
[double] std::stringstream      1,475,996

可以看出atoi類的方法效率最高,sscanf次之,stringstream最慢。

從型別安全性來看:

atoi類的輸入合法性難以檢驗,比如當無法轉換時返回0,使用者無法得知是真的為0,還是轉換失敗。

C++標準庫中的<sstream>提供了比ANSI C的<stdio.h>更高階的一些功能,即單純性、型別安全和可擴充套件性,使得stringstream的轉換擁有型別安全和不會溢位這樣搶眼的特性。

假設你想用sprintf()函式將一個變數從int型別轉換到字串型別。為了正確地完成這個任務,你必須確保證目標緩衝區有足夠大空間以容納轉換完的字串。此外,還必須使用正確的格式化符。如果使用了不正確的格式化符,會導致非預知的後果。下面是一個例子:

int n=10000;
chars[10];
sprintf(s,”%d”,n);// s中的內容為“10000”
到目前為止看起來還不錯。但是,對上面程式碼的一個微小的改變就會使程式崩潰:
int n=10000;
char s[10];
sprintf(s,”%f”,n);// <span style="font-size: 13.3333px;">錯誤地使用了%f格式化符來替代了%d。</span>
在這種情況下,s在呼叫完sprintf()後包含了一個不確定的字串。

而使用stringstream,由於n和s的型別在編譯期就確定了,所以編譯器擁有足夠的資訊來判斷需要哪些轉換。<sstream>庫中宣告的標準類就利用了這一點,自動選擇所必需的轉換。而且,轉換結果儲存在stringstream物件的內部緩衝中。你不必擔心緩衝區溢位,因為這些物件會根據需要自動分配儲存空間。

參考文章:

http://www.cnblogs.com/luxiaoxun/archive/2012/08/03/2621803.html

http://www.cnblogs.com/Anker/p/3351168.html

http://www.cppblog.com/mengkai/archive/2011/09/24/156718.aspx

http://www.cplusplus.com/reference/sstream/stringstream/

http://blog.csdn.net/joeblackzqq/article/details/7032703       (超詳細的關於stringstream的用法)

相關推薦

C語言字串整數相互轉換

C語言提供了幾個標準庫函式,可以將任意型別(整型、長整型、浮點型等)的數字轉換為字串,下面列舉了各函式的方法及其說明。 # include <stdlib.h> 將數字轉換為字串   ● itoa():將整型值轉換為字串。   ● ltoa():將長整

整理C/C++字串整數之間相互轉換

最近刷題過程中總是碰到這個知識點,因此做個總結記錄一下。 一、用C標準IO庫中的sprintf()和sscanf()轉換  sprintf()函式原型: #include <stdio.h> int sprintf(char *str,const char

C#Hex字串整數相互轉換

本文轉換的資料是字元型的日期,數字採用了long,如果是int的情況,將Convert.ToInt64()換成Convert.ToInt32應該就可以了。 //將一個(長)整數轉為Hex字串 Str

C/C++字串數字之間轉換

#include "iostream" #include "string" #include "sstream" #include "cstdio" using namespace std; string num2str(double a) {    stringstream ss;ss << a

c語言字串整數之間轉換

在c語言中,我們經常面臨需要將字串轉換為整型,以及將整型轉化為字串的問題。將字串轉換為整數的函式在stdlib.h中定義:int atoi(const char *str);atoi函式會跳過str中前面出現的空格,從第一個數字開始轉換。下面是我的實現:int my_atoi

總結使用Scala實現JsonCase Class相互轉換

json case classimport org.json4s.native.Serialization.{read, write} object Json2CaseClass extends App { implicit val formats = org.json4s.DefaultFormats

Python字串datetime的相互轉換

1. 字串轉換成datetime物件 from datetime import datetime t = datetime.strptime(append_at, '%Y-%m-%d %H:%M:%S') 結果顯示: <class 'datetime.datetime

java字串陣列之間轉換

做題目時候遇到了這個問題,如何將字串轉換成陣列,翻閱資料得到了答案。 (1)字元轉轉陣列 字串不是陣列,但是字串可以轉換成陣列,反之亦然。為了將字串轉換成一個字元陣列,可以使用String類的toCh

字串整數之間轉換

最近經常用到字串與整數之間的轉換,整理了一下,包含 1、檢驗是否為整數 2、字串轉為整數 3、從字串中提取數字 直接上程式碼: /** * 檢查是否為INT型別,已經對空進行處理 */ public static boolean isInt(

C++C++intstring的相互轉換

一、int轉string 1.c++11標準增加了全域性函式std::to_string: string to_string (int val); string to_string (long val); string to_string (long long val); string to_str

C語言字串各數值型別之間轉換

c語言的演算法設計中,經常會需要用到字串,而由於c語言中字串並不是一個預設型別,其標準庫stdlib設計了很多函式方便我們處理字串與其他數值型別之間的轉換。首先放上一段展示各函式使用的程式碼,大家也可以copy到自己的機器上執行觀察#include <stdio.h&g

轉載 for迴圈i++++i的效率探究

原文連結:https://blog.csdn.net/zy1691/article/details/4849808?utm_source=blogxgwz1 for(int i=0;i<=50;i++)   我們經常會使用這樣的程式碼來做迴圈,一般在for迴圈中習慣於

batch批處理CopyXcopy的區別

###Date: 2017/6/20###Author: Soaringlee1):copy不能在有子目錄存在的檔案中拷貝檔案的同時重新命名此檔名(注:這裡C:為根目錄,bat為子目錄),而xcopy能,不過會出現提示,當然你可以加引數而不使它提示。C:\>copy c

整理MFC下 各種字串型別之間轉換(MSDN及其他寫法)

各個字母代表意義 L 表示long指標,這是為了相容Windows 3.1等16位作業系統遺留下來的,在win32中以及其他的32為作業系統中, long指標和near指標及far修飾符都是為了相容的作用,沒有實際意義。即win32中,long,near,far指標與普通指標沒有區別,LP 與P是等效的

JavaScript2.HttpGetPost兩種請求方式的差異

Get和Post在面試中一般都會問到,一般的區別: (1)post更安全(不會作為url的一部分,不會被快取、儲存在伺服器日誌、以及瀏覽器瀏覽記錄中) (2)post傳送的資料更大(get有url長度限制) (3)post能傳送更多的資料型別(get只能傳送ASCII字元)

C++intstring的相互轉換

一、int轉string 1.c++11標準增加了全域性函式std::to_string: string to_string (int val); string to_string (long val); string to_string (long long val);

虛擬機器WINDOWS如何主機之間直接複製貼上檔案

預設情況下,是不支援的,當複製檔案後,至另一系統(虛擬機器系統或主機系統),貼上為灰色,不可貼上。 解決方案:安裝VMware Tools: 登入虛擬機器; 點選選單“虛擬機器”-“安裝VMware Tools"; 自動播放中選擇“執行……”; 若沒有自動播放

C# Unix時間戳日期的相互轉換

public static string ConvertDateTimeToUnix(DateTime time) { return ((time.ToUniversalTime().Ticks - 621355968

C#(C sharp)字串和時間的相互轉換

C#(C sharp)字串和時間的相互轉換。 一、DateTime –> string 時間型別轉化成字串型別,那是相當的簡單,直接呼叫ToString()方法即可。如: DateTime dt = DateTime.Now; string dtStr = dt.To

IP地址整數之間轉換

1、IP地址轉換為整數 原理:IP地址每段可以看成是8位無符號整數即0-255,把每段拆分成一個二進位制形式組合起來,然後把這個二進位制數轉變成 一個無符號32為整數。 舉例:一個ip地址為10.0.3.193 每段數字 相對應的二進位制數 10 00001010 0 00