【问题标题】:Const char to string with string.at()使用 string.at() 将常量字符转换为字符串
【发布时间】:2016-05-21 04:40:51
【问题描述】:

我有一个字符串

const std::string myString = "my string";

永远不会改变。

另外,我还有以下功能:

void myFunction(const std::string str);

我想逐个字符地遍历字符串并对每个子字符串做一些事情(我将每个子字符串传递给myFunction)。

这是我最开始想出的代码:

for (std::size_t i = 0; i < myString.length(); ++i) {
  myFunction(myString.at(i));
}

但它给了我错误“无法将 const char 转换为字符串”。所以我想出了以下代码:

for (std::size_t i = 0; i < myString.length(); ++i) {
  char currentChar[2] = {myString.at(i), '\0'};
  myFunction(currentChar);
}

这行得通,但我感觉不太好。

这个解决方案正确吗?还是它起作用只是巧合(就像未定义的行为,但我很幸运在我测试它时它起作用了)?

另外,myFunction 中传递的字符串应该是 const 吗?

【问题讨论】:

  • 请明确您想要传递给myFunction 的具体内容。在问题的开头,您说您要传递一个字符串,然后myFunction 将逐个字符地遍历字符串。但在剩下的问题中,您尝试将单个字符传递给myFunction
  • 您正在逐个字符地遍历字符串;您希望将什么子字符串传递给myFunction
  • 澄清了,抱歉!
  • @A. D. 那么,您将每个字符视为一个字符的子字符串吗?如果是这样,为什么将其作为字符串而不是字符传递?
  • 你为什么不让myFunction 接受char (void myFunction(char))?

标签: c++ string char substring constants


【解决方案1】:

是的,您的解决方案是正确的。它既不高效也不美观,但它确实有效。

myFunction 接受一个字符串。你不能给它一个字符。一个字符和一个单字符的字符串是不同的东西。此外,没有将字符转换为字符串的构造函数。

由于myFunction 需要字符串,你应该给它一个字符串,或者至少const char* 可以隐式转换为字符串。

你确定myFunction 真的需要一个字符串,而不是一个字符吗?

顺便说一句,您确定myFunction 不应该通过引用接收字符串吗?

【讨论】:

  • 如果你真的想从一个字符创建一个字符串,使用std::string(1, myString.at(i))。此构造函数表示要创建一个包含给定字符的一份副本的 std::string。
  • @md5i 实际上,最好的方法是在循环外创建一个 1 字符的字符串,并每次更改其第一个字符。这样,构造函数只被调用一次。
  • 鉴于字符串是按值传递的,充其量似乎是一种微优化。最重要的是教用户在传递字符串时创建字符串而不是构造 char 数组。使用std::string::substr 也是一个合理的选择。
  • @md5i 我在回答中解决了按值传递的问题。调用构造函数很昂贵。请注意,即使按值传递也需要与调用构造函数相当的时间。所以不,这不是“微优化”。教用户编写高效的代码很重要,周围有太多的慢。
  • 让函数接受 char 比传递 1 个字符的字符串要好
猜你喜欢
  • 1970-01-01
  • 2012-09-20
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多