【问题标题】:For loop using string.length() [closed]使用 string.length() 循环 [关闭]
【发布时间】:2020-09-16 12:29:30
【问题描述】:

谁能帮我理解为什么这个循环不起作用?我正在尝试做两件事:

  1. 使用 mystring.length() 遍历字符串
  2. 在字符串中查找任何 0 或 1

这两个功能都不起作用。例如,如果我传入一个 123450 的字符串,那么 a) 它只循环一次 b) 即使第一个字符是 1,它也会返回 "no, no, no"

bool recognizer(string s)
{
    string mystring = s;

    for (int i = 0; i < mystring.length(); i++) {
        if ((mystring[i] == 0) || (mystring[i] == 1))  {
            cout << "yes, yes, yes";
            return true;
        }
        else {
            cout << "no,no,no";
            return false;
        }
    }
    
}// end of recognizer

【问题讨论】:

  • 您可能希望使用基于范围的 for 循环。 for (const auto&amp; ch : mystring) { if ( ch == '0' || ch == '1') { // rest of code here
  • no,no,no, Daniel San!
  • OT:最好通过 const 引用传递字符串参数。
  • 复制到mystring似乎也没有意义...
  • 但我需要为字符串中的每个字符返回“true”或“false”。如果 bool 函数在第一次返回后终止,我将如何进行多次返回?

标签: c++ string for-loop


【解决方案1】:

只循环一次

那是因为你 return 来自循环体。

即使第一个字符是 1,它也会返回“no, no, no”

那是因为你不比较 '0''1' 字符,而是 01 整数。


建议的版本:

bool recognizer(const std::string& s)
{
  return std::any_of(s.begin(), s.end(), 
    [](char c){ return (c == '0' || c == '1'); });
}

或者,在 C++20 中:

bool recognizer(std::string_view s)
{
  return std::ranges::any_of(s, [](char c){ return (c == '0' || c == '1'); });
}

或者,使用正则表达式:

bool recognizer(const std::string& s)
{
  return std::regex_match(s, "[01]");
}

【讨论】:

  • string_view!!
  • 不确定any_of 过载是否按原样工作。如果您正在寻找范围版本,那么它位于std::ranges。否则你仍然需要s.begin(), s.end()。但是很高兴能够在不构造 std::string 的情况下传递字符串文字(或其他 C 字符串)(实际上从 C++17 开始我们就可以这样做)
  • @AsteroidsWithWings 你是对的,再次:)
  • 偶尔会发生:P
【解决方案2】:

要循环多次,请删除return true; - 它们会立即返回。因为您已承诺返回 bool,所以您仍然必须这样做 - 但如果您想查看字符串中的所有字符,请在循环结束后执行。

要匹配字符串中的零字符,请尝试使用'0''1' 而不是01

【讨论】:

    【解决方案3】:

    你有两个错误。

    mystring[i]int 进行比较时,您会在第一次迭代时返回。 对比也是错误的。您应该与char 进行比较,而不是int

    bool recognizer(string s)
    {
        string mystring = s;
    
        for (int i = 0; i < mystring.length(); i++) {
            if ((mystring[i] == '0') || (mystring[i] == '1'))  {
                cout << "yes, yes, yes";
                return true;
            }
        }
        return false;
    }// end of recognizer
    

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 2012-09-07
      相关资源
      最近更新 更多