2010-02-18 136 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。这也很丑陋,特别是如果你尝试任何特殊的格式。