我在一个函数中有一个循环,它通过一个数组递增,检查每个元素是否与函数的参数匹配。
我的问题是返回值的要求。由于返回一个值完成了该函数,如果一个错误的匹配返回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));
}
答案 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;
}
当一个简单的函数具有多个出口时,这不是一种好的编程风格,而且在大多数情况下它不是必需的。