C 的string有沒有字串格式化

2021-05-30 21:06:44 字數 5594 閱讀 9692

1樓:你好啊月亮

有的,可以根據以下步驟。

1. 在將各種型別的資料構造成字串時,sprintf 的強大功能很少會讓你失望。由於sprintf 跟printf 在用法上幾乎一樣,只是列印的目的地不同而已,前者列印到字串中,後者則直接在命令列上輸出。

這也導致sprintf 比printf 有用得多。

2. sprintf 是個變參函式,定義如下:int sprintf( char *buffer, const char *format [, argument] ...

);除了前兩個引數型別固定外,後面可以接任意多個引數。而它的精華,顯然就在第二個引數:格式化字串上。

3. printf 和sprintf 都使用格式化字串來指定串的格式,在格式串內部使用一些以"%"開頭的格式說明符(format specifications)來佔據一個位置,在後邊的變參列表中提供相應的變數,最終函式就會用相應位置的變數來替代那個說明符,產生一個呼叫者想要 的字串。

4. sprintf 最常見的應用之一莫過於把整數列印到字串中,所以,spritnf 在大多數場合可以替代itoa。

c++中的string字串如何初始化?

2樓:

string a; a is empty stringstring a (b); initialize a as a copy of b

string a ("djflsd"); initialize a as a copy of the string literal

string a (n, 'a'); initialize a with n copies of the character 'a'

ps: from c++ primer

3樓:匿名使用者

vs2008下string a = null;下可以這樣啊,但是一般賦值為null都是為了野指標用的,就是說給一個指標fp = null這樣使用,你這裡a就是一個物件,一般的話好像不這樣用。

4樓:

string是類。。

string a;就初始化了,類的構造韓式已經搞定一切。

或者string a = "***"也可以~

5樓:匿名使用者

string *a = null 初始化字串指標

string a = " " 初始化字串

6樓:吳鐵騎

你定義型別就自動初始化了

為什麼stl c++ string 中沒有format方法

c++中如何用string實現cstring格式化的功能

7樓:千鋒教育

也就是實現類似下面的功能: 1cstring str; 2double d = 10.24; 3str.

format("d=%.2f",10.24); 其實用c++標準庫來實現也比較簡單,**如下:

#include

24"的string型別的字串。

c++中字串的格式化輸出問題!請高手指教!!!

8樓:匿名使用者

#include

setw(n)用法: 通俗地講就是預設寬度為了方便對齊只要將n值調整好即可,

參考如 cout<

9樓:劍起飛虹

用set(n)啊,不過前面要有#include的標頭檔案,此標頭檔案專門用於控制輸入輸出的。

set(n)設定欄位寬度為n位

不過還要設定成左對齊的方式。具體為:

cout<

#include

using namespace std;

int main()

}return 0;}

10樓:匿名使用者

3.控制浮點數值顯示

使用setprecision(n)可控制輸出流顯示浮點數的數字個數。c++預設的流輸出數值有效位是6。

如果setprecision(n)與setiosflags(ios::fixed)合用,可以控制小數點右邊的數字個數。setiosflags(ios::

fixed)是用定點方式表示實數。

如果與setiosnags(ios::scientific)合用, 可以控制指數表示法的小數位數。setiosflags(ios::scientific)是用指數方式表示實數。

例如,下面的**分別用浮點、定點和指數方式表示一個實數:

//*********************

//** ch2_1.cpp **

//*********************

#include

#include //要用到格式控制符

void main()

執行結果為:

3.14286

3 33.1

3.14

3.143

3.14285714

3.14285714e+00

該程式在32位機器上執行通過。

在用浮點表示的輸出中,setprecision(n)表示有效位數。

第1行輸出數值之前沒有設定有效位數,所以用流的有效位數預設設定值6:第2個輸出設定了有效位數0,c++最小的有效位數為1,所以作為有效位數設定為1來看待:第3~6行輸出按設定的有效位數輸出。

在用定點表示的輸出中,setprecision(n)表示小數位數。

第7行輸出是與setiosflags(ios::fixed)合用。所以setprecision(8)設定的是小數點後面的位數,而非全部數字個數。

在用指數形式輸出時,setprecision(n)表示小數位數。

第8行輸出用setiosflags(ios::scientific)來表示指數表示的輸出形式。其有效位數沿用上次的設定值8。

小數位數截短顯示時,進行4舍5入處理。

4.設定值的輸出寬度

除了使用空格來強行控制輸出間隔外,還可以用setw(n)控制符。如果一個值需要比setw(n)確定的字元數更多的字元,則該值將使用它所需要的所有字元。例如:

float amount=3.14159;

cout <

其執行結果為:3.14159。它並不按4位寬度,而是按實際寬度輸出。

如果一個值的字元數比setw(n)確定的字元個數更少,則在數字字元前顯示空白,不同於其他控制符,setw(n)僅僅影響下一個數值輸出,換句話說,使用setw設定的間隔方式並不保留其效力。例如:

cout<

<<10

<<20<

執行結果為:

-------1020

執行結果中的下橫線表示空格。整數20並沒有按寬度8輸出。setw()的預設值為寬度0,即setw(0),意思是按輸出數值的表示寬度輸出, 所以20就緊挨10了。

c++格式化字串問題 5

11樓:閃亮登場

1 sprintf,snprintf,vsnprintf家族

這幾個函式大家都不陌生,平時用的也比較多。下面我就它的優點簡單的做一個總結:

· 易用性與清晰性:

使用snprintf的常用格式化標誌及其他們的各種組合,使用就變得簡潔明瞭,沒有任何拐彎抹角之處。

· 效率最佳:

能夠直接利用現有的緩衝區,當然你的程式可能根本就不會在乎這點效率的優化。永遠不要過早進行優化。

這個家族的函式最致命的缺陷在於長度安全性。

sprintf是引起緩衝區溢位錯誤的原因之一。snprintf和vsnprintf稍微好些,但也會引起其他的問題。sprintf已經無可救藥了,不提也罷,這個儘量少用。

snprintf和vsnprintf雖然是對長度是安全的,但對於過長的字串,他也暴露了很多他的無奈。

看個例子:

void cstring::format(lpctstr lpszformat,...)

allocated += result;

line = (char*)realloc(line,allocated);

}va_end(ap);

if (line)

else

if (pfree)

}這個函式封裝了vsnprintf,使其可以對任意長度的字串都可以格式化。但仔細分析這個函式,其實他不能對任意長度的字串進行格式化,只能最多格式化2048個字元,即while迴圈只能執行一次,原因在於:vsnprintf只能執行一次,根據man手冊中vsnprintf的解釋,在執行vsnprintf之後,ap的值是未定義的,因此,在while執行第二次的時候,誰知道會發生什麼事情那。

因此,對於不能確定其長度的字串,而這個字串的長度而有可能變的很大的時候,儘量不要用這個封裝的format函式,要自己來控制字串的長度,自己來分配空間,自己呼叫snprintf函式。

這個家族函式的另一個確定是:不是型別安全的。

比如對於int i來說,snprintf(buf,sizeof(buf),"%4c",i)輸出的是字元而不是整數,其實把整數當做字元也沒有什麼錯,這個問題也不嚴重,但是如果一不小心寫成snprintf(buf,sizeof(buf),"%4s",i),這個問題就大發了,程式可能會立即崩潰或至少偶發性的崩潰。這個只是個簡單的例子,其他也有類似問題需要注意。

2 std::stringstream

c++中字串化最常見的設施就是stringstream了。

一個簡單的例子:

void format(int i,string& s)

看一下stringstream的特點:

易用性和簡單性:

這個顯然和snprintf比起來要差一點了,一行可以完成的,現在變成了3行完成。並且不易於學習,你要學習諸如setw類似的函式來控制格式。

效率:stringstream會自己分配一份單獨的緩衝區來存放結果,另外還需要一個輔助性的物件,通常所有這些都意味著需要進行額外的記憶體分配。

長度安全性:

stringstream內部的basic_stringbuf緩衝類會根據需要自動增長,以便容納需要存放的資料,因此是長度安全的。

型別安全性:

使用operator《和過載決議,即便是對於那些提供了自己的流插入操作的自定義流型別,也總能夠實現型別安全,不會因為型別不符而導致一些神祕的執行時錯誤。

3 std::strstream

strstream是要被遺棄的,在c++03標準將它表明為deprecate(不贊成的),因此很多c++書籍頂多也只是略微提及一下。

void format(int i,char* buf,int buflen)

易用性和清晰性:

lexical_cast的**最為直接地表達了實際的意圖。

效率:lexical_cast是stringstream類的一個包裝,因此它至少需要和stringstream一樣的記憶體分配次數。

在長度安全性,型別安全性方面,它和stringstream有一樣的表現。

在c 語言中定義一string型別的字串如何取字串

string str 123456789 if str.length 5 使用substr一定要判斷否則程式會越界!用字元指標 指向該字串 此時指標指向字串的首地址,然後利用指標的移動取字串中的字元 include include using namespace std int main 可以將st...

Java問題 字串String,有字元 數字和特殊字元,怎樣從中提出字元判斷是否為數字或字元

考慮用貪婪正規表示式 從頭開始解析 0 9 abc xyz public class test930 執行結果 第一個 12,第二個 null,第三個 null,第四個 第一個 13,第二個 null,第三個 null,第四個 第一個 ax,第二個 a,第三個 x,第四個 第一個 by,第二個 b,...

c語言字串陣列的問題C語言字串陣列的問題

include int main scanf s a for i 0 a i 0 i for j 0 j 5 j 修改 1 下標從0 4,共5個 return 0 每行結尾的 僅僅是為了連線字串使用的,如果一個字串過長,寫在一行比較不合適,就在該行結尾處加上一個反斜槓 就可以在下邊的行繼續寫這個字串...