【问题标题】:if condition too long and including for loopif 条件太长且包含 for 循环
【发布时间】:2017-10-22 07:10:48
【问题描述】:

您好,我是 C++ 初学者,这是我在编写函数时遇到的一个问题。

bool函数isData用于查看数组成员是否全为数字。通常大小为 11 或 9 或 7,所以我不想硬编码。但我不确定 for 循环是否在 if 条件下工作。如果您能告诉我一个更简单的方法,我将不胜感激。

bool isData(string temp[], int size)
{
  if(
      for (int i;i<size;i++) 
      {
        59 > +temp[i].at(0) && +temp[i].at(0) > 47 || +temp[i].at(0) == 45
      }
    )
    {
      return true;
    }
  else 
    {
      return false;
    }
}

【问题讨论】:

  • 你可能不知道std::all_of?我假设您正在学习一个相当古老的 C++ 教程,因为 string[] 大约有 20 年的历史。这甚至早于 1998 年的 C++ 变体,而 std::all_of 只有 6 岁(2011 年)
  • 您不能使用 for 循环作为 if 语句的条件。条件必须是表达式,而 for 循环不是表达式。
  • 此外,is_digit 的测试比自己检查 ASCII 值更易读。并且检查 == '-' 会比检查 45 更清晰。
  • for (int i;i&lt;size;i++)i的初始值是多少?

标签: c++ arrays function loops if-statement


【解决方案1】:

如果(布尔表达式) 您不能将不返回任何内容的表达式放在 if 内。

bool isData(string temp[], int size)
{
    for (int i = 0; i < size; i++) 
    {
        char* p;
        long converted = strtol(temp[i], &p, 10);
        if (*p) 
        {
            // conversion failed because the input wasn't a number
            return false;
        }
    }
    return true;
}

检查一下: How to determine if a string is a number with C++?

对于 double 你需要使用 strtod 而不是 long 使用 double。

【讨论】:

  • 更糟糕的是,for 语句根本不是表达式。
  • if (*p)?你的意思是if (p)
  • @Jan Khonski 这会处理负数和小数吗?
  • 我添加了一个如何检查数字的链接。 strtod - 它将返回双精度 stackoverflow.com/a/16575025/4587961
  • @BoundaryImposition 如果 (*p)?你的意思是 if (p) 吗? - 不。即使转换成功,如果 (p) 为真。
【解决方案2】:

for 循环不会导致truefalse,因此for 中的if 将不起作用。

相反,在 for 循环中运行所有元素,如果找到非数字,则返回 false。否则,返回true

伪代码就是这样的

bool isData(String temp[], int size) {
    for(int i=0; i < size; i++) {
        if( hasOnlyDigits(temp[i]) ) { return false; }
    }
    return true;
}

hasOnlyDigits 是一个接收string 并检查它是否是有效数字的函数。

这是正数的单行。 bool hasOnlyDigits = (temp[i].find_first_not_of( "0123456789" ) == string::npos);

实现一个处理所有输入(如+.23-33--33)的函数并非易事。实现一个可以在输入约束范围内处理输入的函数。

如果我找到一种可靠的检查方法,我会更新这个答案。

【讨论】:

  • @JanKhonski 谢谢:)。那里有一个错字。我现在编辑了它。
  • 好的,但也要考虑负数。
  • 如果有字符串--33-33怎么办。它会通过你的测试。为方法 isNumber 创建单元测试。
  • @JanKhonski 我正在解决这个问题,我会回来编辑。感谢您指出这一点。
  • 谢谢!我已经尝试过了,现在它工作得很好。并感谢您的详细解释:-)
【解决方案3】:

如果您可以使用 C++11 进行编译,那么您可以使用 std::stoi。类似于上面的答案之一,但具有更好的错误检查并确保循环在整个字符串数组上运行。

bool isData(std::string temp[], int str_size)
{

    bool ret_val = false;
    size_t current_len, processed_len;
    for (int i=0; i < str_size; i++) {
        current_len = temp[i].size();
        try {
            int hidden_num = std::stoi(temp[i], &processed_len);
            std::cout << hidden_num << std::endl;
            if (processed_len == current_len) {
                ret_val = true;
                continue;
            }
        } catch (std::invalid_argument& e) {
            std::cout << "Non-integer input at index " << i << std::endl;
            ret_val = false;
            break;
        }
    }
    return ret_val;
}

【讨论】:

    【解决方案4】:

    这是不必要的:

    if (...some complicated boolean expression...) {
        return true;
    } else {
        return false;
    }
    

    您需要做的就是:

    return ...some complicated boolean expression...;
    

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2017-11-06
      • 1970-01-01
      相关资源
      最近更新 更多