【问题标题】:Iterate through string char by char逐个字符地遍历字符串
【发布时间】:2013-01-18 01:34:30
【问题描述】:

我尝试逐个字符地遍历字符串。我尝试过这样的事情:

void print(const string& infix)
{
char &exp = infix.c_str();
while(&exp!='\0')
{
         cout<< &exp++ << endl;
    }
}

所以这个函数调用 print("hello");应该返回:

h
e
l
l
o

我尝试使用我的代码,但它根本不起作用。顺便说一句,参数是引用而不是指针。谢谢

【问题讨论】:

标签: c++


【解决方案1】:
for(unsigned int i = 0; i<infix.length(); i++) {
    char c = infix[i]; //this is your character
}

我就是这样做的。不确定这是否太“惯用”。

【讨论】:

  • @user1988385,对于打印,即使std::cout &lt;&lt; infix; 也可以。
【解决方案2】:

std::string::c_str() 返回const char*,不能用char&amp; 持有。 exp 也已经是指针了,不需要参考:

最好使用迭代器:

void print(const string& infix)
{
  for (auto c = infix.begin(); c!=infix.end(); ++c)
  {
    std::cout << *c << "\n";
  }
  std::cout << std::endl;
}

要修复您的原始代码,请尝试:

void print(const string& infix)
{
  const char *exp = infix.c_str();
  while(*exp!='\0')
  {
    cout << *exp << endl;
    exp++;
   }
 }

【讨论】:

  • 有什么理由我们会使用 char* 而不是 for 循环(在我的回答中)?我一直不确定其他人是否也是这样做的。
  • @DhaivatPandya,不是真的,不。使用const char * 来迭代std::string 对我来说似乎毫无意义。
【解决方案3】:

如果您使用的是std::string,则确实没有理由这样做。您可以使用迭代器:

for (auto i = inflix.begin(); i != inflix.end(); ++i) std::cout << *i << '\n';

至于您的原始代码,您应该使用char* 而不是char,并且您不需要参考。

【讨论】:

  • 但是,也许他不只是想复制它?他只是被问到如何逐个字符地遍历字符串。
  • 根据您的用途,可能有一些东西可以代替 copy 调用,不过,效果差不多。
  • 输出的有趣之处在于您可以而且应该只是std::cout &lt;&lt; infix;。但是,如果需要做任何其他事情,算法或迭代器循环就可以工作。此外,如果已经使用 auto,我也会在迭代器循环上使用基于范围的 for 循环:p
【解决方案4】:

您的代码需要一个指针,而不是引用,但如果使用 C++11 编译器,您只需要:

void print(const std::string& infix)
{
    for(auto c : infix)
        std::cout << c << std::endl;
}

【讨论】:

  • 最佳答案。很干净
猜你喜欢
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 2021-06-30
  • 2018-05-15
相关资源
最近更新 更多