通常,当我想检查存储在多个字符串中的更多输入是否为空时,我会遵循这个简单的方法:
std::string fieldA = "";
std::string fieldB = "";
std::string fieldC = "Hello";
现在,我可以查看所有内容:
if ( fieldA.empty() || fieldB.empty() || fieldC.empty() )
std::cout << "Oh oh.. one or more fields are empty << std::endl;
但是知道哪些字段是空的会很好,然后,我可以写:
if ( fieldA.empty() )
std::cout << "fieldA is empty" << std::endl;
if ( fieldB.empty() )
std::cout << "fieldB is empty" << std::endl;
if ( fieldC.empty() )
std::cout << "fieldC is empty" << std::endl;
但是通过这种方式我可以发现fieldA是空的但不是fieldB,在这个例子中我只有三个字段,但是有更多的字段?
管理多个字符串的控制并找到空字符串的最佳做法是什么?
答案 0 :(得分:2)
PaulMcKenzie 的评论是您应该遵循的评论。但假设您的示例过度简化了代码,并且您无法将所有变量放入数组中,我认为如果您使用一个小宏来为您进行字符串化,则可以原谅:
#define PRINT_IF_EMPTY(var) \
do { \
if (var.empty()) \
std::cout << #var " is empty" << std::endl; \
} while(0)
您现在可以用以下代码替换您的代码:
PRINT_IF_EMPTY(fieldA);
PRINT_IF_EMPTY(fieldB);
PRINT_IF_EMPTY(fieldC);
答案 1 :(得分:0)
您应该使用单独的FieldValidator
课程。有了它,您的代码应如下所示:
FieldValidator val;
val.requireNotEmpty("field1", field1);
val.requireNotEmpty("field2", field2);
这个想法是所有验证状态都保存在一个地方。我确信这样的课程已经存在,因为你不是第一个解决这个问题的人。
答案 2 :(得分:0)
如果打印哪个字段为空是非必需的,并且您希望字段是不同的变量,则可以在初始化列表上使用for-range循环:
for (const std::string str : {fieldA, fieldB, fieldC})
{
if (str.empty())
{
std::cout << "One or more fields are empty." << std::endl;
break; // Break out of the for loop
}
}