2012-06-09 74 views
1

我是用C++編程的。如何將std :: string轉換爲C風格的字符串

這個問題的基本問題是,我似乎無法在任何地方找到答案。所以這裏是問題:

我想創建一個C風格的字符串,但我想把一個整數變量我放入字符串。所以很自然的,我用了一個流:

stringstream foo; 
foo 
       << "blah blah blah blah... i = " 
       << i 
       << " blah blah... "; 

不過,我需要以某種方式獲得C風格的字符串傳遞給函數(原來foo.str()返回的std :: string)。所以這在技術上是一個三部分問題 -

1)如何將std :: string轉換爲C風格的字符串?

2)有沒有辦法從stringstream獲取C風格的字符串?

3)有沒有辦法直接使用C風格的字符串(不使用stringstreams)來構造一個帶有整型變量的字符串?

+1

最簡單的方法是使用流創建一個'itos'函數,並使用'itos(564).c_str()',函數返回'foo.str()'。 – chris

+1

'sprintf()'和緩衝區溢出安全的'snprintf()'將會按照您指定的格式填充一個cstring。 – jedwards

回答

10

1)如何將std :: string轉換爲C風格的字符串?

只需致電string.c_str()即可獲得char const*。如果你需要一個可變的 _C-style_字符串,然後複製一份。返回的C字符串將是有效的,只要您不調用任何非const函數string

2)有沒有辦法從stringstream中獲得C風格的字符串?

有,簡單地說strstream.str().c_str()。返回的C字符串將僅在包含它的表達式的結尾有效,這意味着可以將其用作函數參數,但不能存儲在變量中以供以後訪問。

3)有沒有辦法直接使用C風格的字符串(不使用stringstreams)來構造一個帶有整型變量的字符串?

還有就是Ç方式,使用sprintf等。

-1
  1. 這是真的簡單

    #include <afx.h> 
    std::string s("Hello"); 
    CString cs(s.c_str()); 
    
  2. 沒有

  3. 喲可以使用sprintf格式化C風格的字符串

3

你得到了一半。您需要foo.str().c_str();

  1. your_string.c-str() - 但是這並沒有真正轉換,它只是給你一個指針(暫時)也持同樣內容的字符串的緩衝區。
  2. 是的,以上,foo.str().c_str()
  3. 是的,但你通常會避免這種情況。你基本上會在「真正的程序員可以用任何語言寫C」的陷阱。
+0

我聽說過關於FORTRAN的一個笑話,但是從什麼時候開始變得hip on於C :-(。 – jedwards

+0

@jedwards:我根本就不會在C上抨擊 - 但我認爲選擇一個或更好除了C++的寫入位以及非C++習慣用法的混合。 –

相關問題