我已经掌握了C#,我决定开始使用C ++来处理一些私事。无论如何我想知道在C ++中如何做到这一点(C#)。
for (int i = 0; i < 16; i++)
say("[" + i + "] idk");
非常感谢任何和所有帮助,如果它有助于我使用Native C ++编写。
答案 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::string
和const char[6]
,也是预期的行为。
事实上,对于std::string
,所有字符数组处理似乎都是自动化的,您几乎不再需要关心C遗留。