如何在char *中插入变量的值

时间:2014-07-27 02:44:30

标签: c++ native

我已经掌握了C#,我决定开始使用C ++来处理一些私事。无论如何我想知道在C ++中如何做到这一点(C#)。

for (int i = 0; i < 16; i++)
 say("[" + i + "] idk");

非常感谢任何和所有帮助,如果它有助于我使用Native C ++编写。

4 个答案:

答案 0 :(得分:1)

"["本身就是一个C风格的字符串常量。它是不可变的,没有为它定义重载+运算符。但是,如果您使用std::string,您将获得类似C#字符串的内容。

for (int i = 0; i < 16; i++)
    say(std::string("[") + "] idk");

仅适用于附加其他字符串。如果你想附加一些不是字符串的东西,你需要先转换它。最简单的方法是使用std :: ostringstream:

for (int i = 0; i < 16; i++)
{
    std::ostringstream ostr;
    ostr << "[" << i << "] idk";
    say(ostr.str());
}

答案 1 :(得分:1)

克里斯的评论中提出了最简单的方法。

#include <string>
for (int i{0}; i != 16; ++i) {
    say("[" + std::to_string(i) + "] idk");
}

答案 2 :(得分:0)

您也可以使用stringstream s,

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
    ostringstream os;
    for (int i = 0; i < 16; i++)
    {
        os << "[" << i << "] idk";
        cout << os.str() << endl; // replace by `say(...)` in your code
        os.str(""); // clear the stream for the next iteration
    }

}

答案 3 :(得分:0)

for (int i = 0; i < 16; i++)
 say("[" + i + "] idk");

首先,尝试更改for - 循环样式以使用预增量而不是后增量。它对int没有任何影响,但与其他能够产生影响的情况一致。

for (int i = 0; i < 16; ++i)

现在应该解释为什么添加语句失败了。请注意,因为这比实际的解决方案更加 更复杂,但IMO很难理解。

您可能会收到类似invalid operands of types const char* and const char [6]之类的错误消息。这是因为在C ++中,基本的字符串处理是从C继承的,它没有字符串类但是处理字符数组,字符串的结尾是按惯例定义的&#34;不可见&#34;所谓的空字符别名'\0'作为数组的最后一个元素。

特别是

  • "["被视为包含2个字符的不可修改的数组 终止空字符。换句话说,它是一个字面意思 键入char const [2],也可以写为const char[2]

  • "] idk"被认为是一个包含6个字符的不可修改的数组 包括终止空字符。它是一个字面的类型 char const [6]const char[6]

现在让我们传播"[" + i + "] idk"表达式。

第一个添加是"["i的添加。它会向int添加const char[2]。这恰好是C ++中的合法操作,结果是指针到不可修改的字符,char const *(也可以写成const char *),即地址记忆中的一个角色。您实际上获取数组的第一个元素的地址并从那里i次前进。当然,这在这里完全是胡说八道,并且已经导致未定义的结果,因为您正在访问一个您不能尝试访问的内存区域。

尽管如此,编译器允许您这样做,因此第一次添加后会留下const char *

第二次添加是"[" + i"] idk"的添加。它会尝试将const char[6]添加到const char*。最后,这是编译器抱怨的地方,因为在一个地址中添加一个数组根本没有意义。

正如你所看到的,摆弄数组和指针并不好。幸运的是,C ++有一个真正的字符串类。它被称为std::string,并且具有+个添加项的预期行为。你必须将中间操作数转换为std::string并且你会没事的。要将int变为std::string,请使用std::to_string(如果您使用的是C ++ 11),或使用std::ostringstream

"[" + std::to_string(i) + "] idk"

这将有效,因为第一次添加将是const char[2]std::string之一,它具有预期的字符串连接行为,从而产生新的std::string,并且第二次添加将是新的std::stringconst char[6],也是预期的行为。

事实上,对于std::string,所有字符数组处理似乎都是自动化的,您几乎不再需要关心C遗留。