C++:如何构建字符串/ char*

15
我是C++的新手。我想要创建一个char*,但我不知道如何操作。
在Java中只需这样做吗?
int player = 0;
int cpu = 0;
String s = "You: " + player + " CPU: " + cpu;

我该如何做到这点?我需要一个char*

我专注于将整数粘贴到字符串后面。


你到底想做什么?你需要一个接受 char * 并对其进行什么操作的方法?你在后面的示例中与自己的说法相矛盾。请明确说明你需要的内容。 - IVlad
3
既然你坚决不使用C++的结构,那么你应该从你的问题中删除C++,并改为使用C语言进行提问。这时你就可以接受使用sprintf函数的答案了。 - KevinDTimm
5
不,你的编译器没有问题。 - nos
6个回答

43

如果可能的话,您几乎肯定不想处理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++。

11
除了最后一条评论,我同意所有的内容......在线上有一些非常优秀的 C++ 资源和教程,包括《C++ 初学者》、《21天学会 C++》、《Parashift C++ FAQ Lite》和《高级 C++ 课程》。当然,还需要实践。 - Michael Aaron Safyan
1
关于 char* request... 假设该函数不会写入字符串,可以使用 const_cast<char*>(s.c_str()) 将类型为 const char* 的 s.c_str() 转换为类型为 char* 的对象。然而,这种方法非常 hackish。如果可能的话,最好更改其他函数的签名以使用类型 const char* 或者更好的是 const std::string&。 - Michael Aaron Safyan
1
我想在最后一条评论中支持@MichaelAaronSafyan的观点。我在几乎没有编程经验的情况下自学了C++,并在购买一本书之前变得相当熟练。我想把http://www.learncpp.com/ 加入到列表中 - 在我看来,这可能是网络上最好的入门教程。 - Conduit

10

如果您在使用C++,只需使用std::string。如果您正在使用char*,则可能需要直接使用C。在C的情况下,您可以使用sprintf函数:

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

我很新,请问我需要如何初始化s - Martijn Courteaux
例如使用char s[50]表示49个字符(+0个字符用于字符串终止),或使用char* s = new char[50]进行动态分配。 - Mathias Soeken

2

只需调用s.c_str();在这里您可以查看更多信息。

PS。您可以使用strcpy将内容复制到新变量中,然后就可以更改它了。


但是我得到了一个 const char*,而我需要的是 char*。我尝试使用 const_cast<char*>(str),但它在 C++ 库中出现了错误。 - Martijn Courteaux
我建议你更详细地阐述你在这里尝试做什么。 - Artem Barger
尝试使用const_cast<char*>(str.c_str())。 - codencandy
编译时出现的错误已发布在此处:http://stackoverflow.com/questions/2289168/c-newbie-is-this-code-valid-or-is-it-the-compiler - Martijn Courteaux

1

char * 表示“指向字符的指针”。

您可以像这样创建指向“字符串”的指针:

char* myString = "My long string";

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

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

注意最后一个例子开头的const。这意味着您无法更改所指向的字符。您可以对第一个示例执行相同的操作:

const char* = "My long string";

0
考虑使用字符串流:
#include <iostream>
#include <sstream>

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

    stringstream t;

    t << "test " << i;

    cout << t.str();
}

但它将返回字符串而不是char*。 - Artem Barger
我认为cout << const_cast<char *>(t.str().c_str());会返回他所需的char *,但这样做相当丑陋。如果原始问题确实需要一个char *,我建议使用Rupert Jones发布的sprintf解决方案。 - IVlad

0

如果C++重载了"+"运算符,就像你展示的那样,这可能是最好的。可惜,他们没有这样做(但如果你愿意,你可以这样做)。

C++中将整数变量转换为字符串有基本上三种方法:两种继承自C语言,一种是C++新添加的。

  1. itoa()例程。这实际上是非标准的,但大多数编译器都有它。它的好处在于它返回一个指向字符串的指针,因此可以在函数式编程中使用。
  2. sprintf()。这是从C语言继承下来的第二个例程,它接受一个目标字符串、一个格式字符串和一个参数列表。有多少个参数以及它们如何被解释取决于“格式”字符串的解析方式。这使得sprintf既强大又危险。如果你使用这种方法,我几乎可以保证你会在最初的几次尝试中遇到崩溃错误。
  3. std::ostringstream。这是C++的方式。它几乎拥有sprintf()的所有功能,但更加安全。缺点是你必须声明它,并且它不是一个字符串,所以当你完成后仍然需要将其转换为一个字符串。这意味着至少需要三行代码才能对ostringstream进行任何操作。而且,如果你尝试任何特殊格式,它看起来真的很丑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接