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

C++ 检查多个字符串是否为空并打印其名称,c++,string,is-empty,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::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()| | fieldB.empty()| | fieldC.empty())

std::coutPaulMcKenzie的评论是你应该遵循的。但假设您的示例过于简化了代码,并且您不能将所有变量放入一个数组中,我认为如果您使用一个小宏来为您进行字符串化,则可以原谅您:

#define PRINT_IF_EMPTY(var) \
do { \
  if (var.empty()) \
    std::cout << #var " is empty" << std::endl; \
} while(0)

对于类似类型的数据,最好使用容器(,e.t.c)

假设您已将
std::string
存储在
std::vector

std::vector<std::strting> data;
// Now you have to insert std::string in std::vector.

for( int i = 0; i < data.size(); i++) {
    if(data[i].empty())
        std::cout << "field" << (char)i+65 << " is empty \n";
}
std::矢量数据;
//现在必须在std::vector中插入std::string。
对于(int i=0;istd::cout您应该使用一个单独的
FieldValidator
类。这样,您的代码应该如下所示:

FieldValidator val;
val.requireNotEmpty("field1", field1);
val.requireNotEmpty("field2", field2);

其思想是所有验证状态都保存在一个地方。我确信这样的类已经存在于某个地方,因为您不是第一个解决此任务的人。

如果打印哪个字段是空的不是强制性的,并且如果您希望字段是不同的变量,您可以在初始值设定项列表上使用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
    }
}
for(const std::string str:{fieldA,fieldB,fieldC})
{
if(str.empty())
{

STD::CUT学习使用数组或容器类来代替单独的字符串变量。然后剩下的就变得容易了。在正常的事件过程中,变量名在运行时不可用。如果要在运行时将名称与值关联,则需要某种映射。用户应该是两个不同的东西。您的变量可能被称为
fieldFirstName
,但用户应该看到类似“firstname”的内容。老实说,不,我不认为这是可以原谅的。我肯定会在任何代码审查中反对它!:)@ChristianHackl,如果这些宏是调试实用程序的一部分并被有条件地编译掉,你就不会有什么影响:)问题不在于它们是否被编译掉(事实上,我不想删除发行版中最需要的有价值的调试信息,但当然不应该只将其写入stdout)。关键是它们使代码更难阅读。宏也不表示它只是为了调试而存在,也不表示它是用某些编译器设置编译的。此外,它使用了
std::endl
,这可能是
'\n'
,但这是一个小小的挑剔。@ChristianHackl,我想说你是在挑剔这个问题acro示例。OP问了一个关于删除复制意大利面代码的简单问题。当然,我不知道它是否用于调试目的;答案只是关于如何进行调试。如果您认为这是一个技术上不好的答案,或者应该给出一个产品质量的答案,请随意否决并提供示例。我试图让一个初学者保持原样M使用宏,这是真的,但这不是足够的理由投票。技术上是正确的,它只是刷掉了所有被验证的和测试过的C++中的宏用法的指导。我更喜欢“复制意大利面条代码”,这更难写,但更容易阅读。
FieldValidator val;
val.requireNotEmpty("field1", field1);
val.requireNotEmpty("field2", field2);
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
    }
}