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

Posted

技术标签:

【中文标题】C++:如何构建字符串/字符*【英文标题】:C++: How to build Strings / char* 【发布时间】:2010-02-18 13:45:33 【问题描述】:

我是 C++ 新手。我想做一个char*,但我不知道怎么做。 在 Java 中就是这样:

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

我该怎么做?我需要一个char*

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

【问题讨论】:

你到底想做什么?您需要一个采用 char * 的方法并用它做什么?您稍后在帖子中与您的示例相矛盾。请清楚您到底需要什么。 既然您坚持不使用 C++ 结构,您应该从您的问题中删除 C++,而是询问 C。此时您可以接受 sprintf 的答案。 没有。您的编译器没有损坏。 【参考方案1】:

如果你能提供帮助,你几乎肯定不想处理 char * - 你需要 C++ std::string 类:

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

或相关的字符串流类:

#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++。您无法仅从 Internet 资源中学习 C++。

【讨论】:

同意除最后一条评论之外的所有内容...网上有一些非常出色的 C++ 资源和教程,包括“A Beginner's C++”、“Learn C++ in 21 Days”、“Parashift C++ FAQ Lite”和“高级 C++ 课程”。当然,也需要练习。 关于 char* 请求...假设函数不会写入字符串,可以使用 const_cast(s.c_str()) 来转换 s .c_str() -- const char* 类型 -- 到 char* 类型的对象。但是,这是非常骇人听闻的。如果可能,最好将另一个函数的签名更改为使用 const char* 类型,或者更好的是 const std::string&。 第二条@MichaelAaronSafyan 关于最后一条评论。我是自学 C++ 的,几乎没有编程经验,在购买一本书之前就变得相当有能力了。我想在列表中添加learncpp.com - 这可能是网上最好的介绍,imo。【参考方案2】:

如果您使用 C++,只需使用 std::string。如果您使用char*,您可能希望直接使用C。如果是 C,您可以使用 sprintf 函数:

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

【讨论】:

我是新手。我需要如何初始化s 例如char s[50] 用于 49 个字符(+ 0 字符用于字符串终止)或char* s = new char[50] 用于动态分配。【参考方案3】:

只需致电s.c_str( );.Here 即可查看更多信息。

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

【讨论】:

但是我得到了const char*,我需要char*。我尝试使用const_cast&lt;char*&gt;(str),但它在 c++ 库中出现错误。 我建议你在这里详细说明你想要做的事情。 尝试 const_cast(str.c_str()) 我在编译时遇到的错误贴在这里:***.com/questions/2289168/…【参考方案4】:

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";

【讨论】:

【参考方案5】:

考虑使用字符串流:

#include <iostream>
#include <sstream>

using namespace std;
int main ()

    int i = 10;

    stringstream t;

    t << "test " << i;

    cout << t.str();

【讨论】:

但它会返回字符串而不是 char*。 我认为 cout (t.str().c_str());将返回他需要的 char *,但这很丑陋。如果 OP 必须有 char *,我建议使用 Rupert Jones 发布的 sprintf 解决方案。【参考方案6】:

如果 C++ 像你展示的那样重载了“+”运算符,那可能是最好的。可悲的是,他们没有(如果你愿意,你可以)。

C++中将整数变量转换为字符串的方法基本有3种;两个继承自 C,一个新继承自 C++。

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

【讨论】:

以上是关于C++:如何构建字符串/字符*的主要内容,如果未能解决你的问题,请参考以下文章

c++字符串,删除字符'b'并将字符'a'替换为两个'd'的构建函数

当我不使用标准字符串时,如何在 C++ 中将字符串转换为 int?

如何使用 QT 和 C++ 将字符串参数传递给函数

创建一个简单的 C++ 字符串类

如何将字符串从 Python3 传递给 cythonized C++ 函数

C++ 从函数调用的多次返回中构建字符串向量的最佳方法