检查多个字符串是否为空并打印其名称

时间:2016-11-06 06:47:06

标签: c++ string is-empty

通常,当我想检查存储在多个字符串中的更多输入是否为空时,我会遵循这个简单的方法:

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,在这个例子中我只有三个字段,但是有更多的字段?

管理多个字符串的控制并找到空字符串的最佳做法是什么?

3 个答案:

答案 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
    }
}