2010-02-18 135 views
7

我是C++新手。我想製作一個char*,但我不知道如何。
在Java它只是這樣的:C++:如何構建字符串/ char *

int player = 0; 
int cpu = 0; 
String s = "You: " + player + " CPU: " + cpu; 

我怎樣才能做到這一點?我需要一個char*

我關注粘貼字符串後的整數。

+0

你究竟想要做什麼?你需要一個方法,需要一個char *並對它做什麼?你後來在你的文章中與你的例子相矛盾。請清楚你需要什麼。 – IVlad 2010-02-18 14:05:58

+3

既然你堅持不使用C++構造,你應該從你的問題中刪除C++,而不是問C。在哪個時候你可以接受sprintf答案。 – KevinDTimm 2010-02-18 14:13:16

+5

不可以。您的編譯器沒有損壞。 – nos 2010-02-18 15:03:20

回答

27

你幾乎肯定不希望處理的char *如果你能幫助它 - 你需要的C++ std :: string類:

#include <string> 
.. 
string name = "fred"; 

或相關的stringstream類:

#include <sstream> 
#include <string> 
#include <iostream> 
using namespace std; 

int main() { 

    int player = 0; 
    int cpu = 0; 

    ostringstream os; 
    os << "You: " << player << " CPU: " << cpu; 
    string s = os.str(); 
    cout << s << endl; 
} 

如果你確實需要一個字符指針(你沒有說出你爲什麼這麼做),你可以使用它的c_str()成員函數從字符串中得到一個。

所有這些都應該包含在任何介紹性的C++教科書中。如果你還沒有買過,請獲得Accelerated C++。你無法單獨從互聯網資源中學習C++。

+6

除了最後一條評論以外,還有其他一些事情......有一些非常出色的C++資源和教程,包括「初學者的C++」,「21天學習C++」,「Parashift C++ FAQ Lite」和「高級C++課程」 。當然,練習也是需要的。 – 2010-02-19 08:13:13

+0

關於char *請求...假設函數不會寫入字符串,可以使用const_cast (s.c_str())來轉換s.c_str() - 這是一種類型const char * - 給char *類型的對象。但是,這是非常黑客。如果可能的話,更好的辦法是將其他函數的簽名更改爲使用類型const char *,或者甚至更好,const std :: string&。 – 2010-02-19 08:14:49

+0

關於最後一條評論,請關注@MichaelAaronSafyan。我自己學習了C++,幾乎沒有編程經驗,在購買單本書之前變得相當有能力。我想將http://www.learncpp.com/添加到列表中 - 它可能是網絡上最好的介紹,即imo。 – Conduit 2015-10-07 16:02:30

2

只需致電s.c_str();即可。 Here你可以看到更多。

PS。您可以使用strcpy將內容複製到新變量,然後您就可以對其進行更改。

+0

但是我得到一個'const char *',我需要'char *'。我嘗試過'const_cast (str)',但它在C++庫中給出錯誤。 – 2010-02-18 13:49:25

+0

我建議你詳細說明你在這裏要做的事情。 – 2010-02-18 13:51:06

+0

嘗試const_cast (str.c_str()) – 2010-02-18 14:07:28

0

char *表示「指向角色的指針」。

您可以創建一個指向這樣的 '字符串':

char* myString = "My long string"; 

或者您可以使用的std :: string:

std::string myStdString("Another long string"); 
const char* myStdString.c_str(); 

通知的常量在最後一個例子的開始。這意味着你不能改變指向的字符。你可以做同樣的第一個例子:

const char* = "My long string"; 
0

考慮使用stringstreams:

#include <iostream> 
#include <sstream> 

using namespace std; 
int main() 
{ 
    int i = 10; 

    stringstream t; 

    t << "test " << i; 

    cout << t.str(); 
} 
+0

但它會返回字符串,而不是char *。 – 2010-02-18 13:55:08

+0

我認爲cout << const_cast (t.str()。c_str());將返回他需要的char *,但這非常難看。如果OP必須有char *,我建議由Rupert Jones發佈sprintf解決方案。 – IVlad 2010-02-18 13:59:41

6

如果您使用C++,只需使用std::string即可。如果你使用char*,你可能想直接使用C語言。在C的情況下,可以使用sprintf功能:

char* s = // initialized properly 
sprintf(s, "You: %d CPU: %d", player, cpu); 
+0

我很新。我該如何初始化's'? – 2010-02-18 14:06:15

+0

例如,對於動態分配,對於49個字符(字符串終止爲+ 0個字符)或'char * s =新字符[50]',使用'char s [50]'。 – 2010-02-18 14:40:13

0

或許,這將一直是最好的,如果C++超載了「+」操作符像你這樣的表現。可悲的是,他們沒有(你可以,如果你想的話)。

基本上有三種方法將整型變量轉換爲C++中的字符串;兩個從C繼承而來,另一個爲C++創建。

  1. itoa()例行公事。這實際上是非標準的,但大多數編譯器都有。關於它的好處是它返回一個指向字符串的指針,所以它可以在函數式編程中使用。
  2. sprintf()。從C開始的第二個暫停,此例程接受一個目標字符串,一個格式字符串和一個參數列表。有多少個參數,以及它們的解釋方式取決於「格式」字符串解析的方式。這使得sprintf非常強大和非常危險。如果你使用這種方法,我幾乎可以保證你的前幾次嘗試會碰到bug。
  3. std::ostringstream。 C++的方式。這幾乎包含了sprintf()的所有功能,但是更安全的是更多。這裏的缺點是你必須聲明它,它是而不是一個字符串,所以當你完成後你仍然需要將它轉換爲一個。這意味着至少需要三行代碼才能執行什麼與ostringstream。這也很醜陋,特別是如果你嘗試任何特殊的格式。