C ++ |如何在不返回值的情况下循环使用If语句

时间:2017-03-01 00:54:07

标签: c++ function loops boolean return-value

我在一个函数中有一个循环,它通过一个数组递增,检查每个元素是否与函数的参数匹配。

我的问题是返回值的要求。由于返回一个值完成了该函数,如果一个错误的匹配返回false并且我需要在每个控制路径返回一个值,那么我将无法检查数组中的任何其他元素以查看它们是否匹配

我的大多数经验都在AS3中,其功能结构确实有效。我如何在C ++中正确构建此函数?

功能:它的目的是检查输入的命令是否存在,如果为true或false则返回布尔值

bool Commands(string _input)
{
    string cmds[] = { "login", "logout", "exit" };

    int i = 0;
    do {
        if (_input == cmds[i])
        {
            return true;
        }
        else
        {
            if (i == sizeof(cmds))
            {
                return false;
            }
        }
        i++;
    } while (i < sizeof(cmds));
}

3 个答案:

答案 0 :(得分:1)

我会建议一些改进:

sizeof(cmds)返回cmds字节,在{64}系统上为sizeof(string) * 3或例如96;你的循环将在数组的末尾运行,导致未定义的行为。一种选择是使用sizeof(cmds)/sizeof(*cmds)来获取元素的数量,但为了您的目的,使用带有初始化列表的std::vector会更简单:

std::vector<string> cmds { "login", "logout", "exit" };

接下来,您可以将do循环替换为for循环,将sizeof替换为.size()成员函数std::vector。如果输入不匹配,则只需执行return并继续循环的下一次迭代。如果循环后没有返回该函数,则找不到任何项,因此您可以return false

for (size_t i = 0; i < cmds.size(); ++i)
  if (_input == cmds[i])
    return true;
return false;

您还可以通过调用标准std::find标题中的<algorithm>算法来替换循环:

return std::find(std::begin(cmds), std::end(cmds), _input) != std::end(cmds);

答案 1 :(得分:0)

在循环播放时,找到您要查找的值时返回true。否则,当循环完成时,您只需在循环后返回false

bool Commands(string _input) {
    string cmds[] = { "login", "logout", "exit" };

    int i = 0;
    do {
        if (_input == cmds[i]) {
            return true; // we found it!
        }
        i++;
    } while (i < sizeof(cmds));
    return false; // we didn't find it.
}

答案 2 :(得分:0)

对于初学者,最好将参数声明为常量引用。 无需声明std::string类型的对象数组。声明一个字符串文字数组要好得多。

循环错误。例如,此表达式sizeof(cmds)在诸如此

之类的条件下不会出现
 if (i == sizeof(cmds))

数组中的元素数量计算如

sizeof(cmds) / sizeof( *cmds)

使用标准算法可以大大简化该功能。

只需写下

#include <iostream>
#include <iomanip>
#include <string>
#include <algorithm>
#include <iterator>

bool Commands( const std::string &s )
{
    const char * cmds[] = { "login", "logout", "exit" };

    return std::find( std::begin( cmds ), std::end( cmds ), s ) != std::end( cmds );
}

int main() 
{
    std::cout << std::boolalpha << Commands( "logout" ) << std::endl;
    std::cout << std::boolalpha << Commands( "hello" ) << std::endl;

    return 0;
}

程序输出

true
false

如果你想在函数中使用一个循环,那么它可能看起来如下所示

#include <iostream>
#include <iomanip>
#include <string>

bool Commands( const std::string &s )
{
    const char * cmds[] = { "login", "logout", "exit" };
    const size_t N = sizeof( cmds ) / sizeof( *cmds );

    size_t i = 0;

    while ( i < N && s != cmds[i] ) i++;

    return i != N;
}

int main() 
{
    std::cout << std::boolalpha << Commands( "logout" ) << std::endl;
    std::cout << std::boolalpha << Commands( "hello" ) << std::endl;

    return 0;
}

当一个简单的函数具有多个出口时,这不是一种好的编程风格,而且在大多数情况下它不是必需的。