提问者:小点点

检查字符串中的小写字符或空格。布尔值不工作


这将检查输入的字符串是否是有效的许可证号。有效数字不能有任何小写字母或空格。如果我输入“cat”,它应该看到字符“c”较低,因此它应该将bool isValid设置为false,从循环中中断,然后打印“cat is not a valid license number”。但是,它不是,它只是使bool对我在开始时设置的值有效,这是真的。因此,如果我将它初始化为false并输入“cat”,isValid仍然是false。

int main()
{
    // Input
    cout << "Enter a valid license number: ";
    string license_number;
    getline(cin, license_number);
    cout << endl;

    // Initialize boolean
    bool isValid = true;

    // Loop to check for space or lowercase
    for (int i = 0; i < license_number.size(); i++)
    {
        if (isspace(license_number[i]) || islower(license_number[i]))
        {
            bool isValid = false;
            break;
        }

        else
            bool isValid = true;
    }

    // Output
    if (isValid == true)
        cout << license_number << " is a valid license number." << endl;

    else
        cout << license_number << " is not a valid license number." << endl;

    return 0;
}

共2个答案

匿名用户

问题就在这里:

bool isValid = false;
    break;

您不会更改变量。相反,您正在创建一个新的,它遮蔽了原始的,并且当新变量随后超出作用域时,它将立即被丢弃。因此,您的原始不受影响。删除这一行中的,它就可以工作了。

除此之外,您还可以移除此部件

else
    bool isValid = true;

因为当到达这部分代码时,仍然是。另外,您可以简单地编写,而不是。您甚至可以这样简化代码:

// Loop to check for space or lowercase
for (int i = 0; i < license_number.size(); i++)
{
    if (isspace(license_number[i]) || islower(license_number[i]) )
    {
        cout << license_number << " is not a valid license number." << endl;
        return 0;
    }
}

cout << license_number << " is a valid license number." << endl;

return 0;

另外,如果您有时间,请看看为什么“使用名称空间标准”被认为是糟糕的实践?。

匿名用户

您只需从for循环中删除类型(在条件中)--它定义了一个新的局部变量,该变量隐藏了循环外的定义(在注释下)&;一旦命令流走出定义它的块,这个局部定义就不复存在。

在该块之外,定义再次发挥作用(该定义在处理逻辑中保持不变)。