C++ & &操作符不评估条件

C++ & &操作符不评估条件,c++,C++,我有一段代码,它确保用户输入一个不带前导零的N位数字。我对C++是新的,但我觉得方法正确。如果有什么不对劲,请改正 #include <iostream> #include <string> #include <cmath> std::string get_input(int n) { std::string guess; do { std::cout << "Enter a " <

我有一段代码,它确保用户输入一个不带前导零的N位数字。我对C++是新的,但我觉得方法正确。如果有什么不对劲,请改正

#include <iostream>
#include <string>
#include <cmath>

std::string get_input(int n) {
    std::string guess;
    do
    {
        std::cout << "Enter a " << n << "-digit Number: ";
        std::cin >> guess;
    } while( (guess.length() != n) && (std::stoi(guess) / std::pow(10,n) == 0) );
    return guess; 
}


int main() {
    int n {};
    std::cout << "Enter N: ";
    std::cin >> n;
    std::string guess{get_input(n)};
    return 0; 
}
此程序接受任意长度的字符串编号。解决方案的哪一部分似乎是错误的? PS:我使用C++17 std=C++17

编辑:添加执行示例


你的逻辑不正确。当输入字符串的长度不合适或者输入字符串中有一些前导零时,您需要不断请求输入

所以你的情况应该是:

do {
 // ...
} while ((guess.length() != n) || (std::stoi(guess) / std::pow(10,n) == 0))
另外,您可以检查前导零,而不是使用std::pow和std::stoi,如下所示:

do {
 // ...
} while ((guess.length() != n) || (guess[0] == '0'))

你的逻辑不正确。当输入字符串的长度不合适或者输入字符串中有一些前导零时,您需要不断请求输入

所以你的情况应该是:

do {
 // ...
} while ((guess.length() != n) || (std::stoi(guess) / std::pow(10,n) == 0))
另外,您可以检查前导零,而不是使用std::pow和std::stoi,如下所示:

do {
 // ...
} while ((guess.length() != n) || (guess[0] == '0'))
&&不是正确的逻辑操作数。你需要使用| |

如果将逻辑重新表述为:

bool isValidInput(string const& guess)
{
   return (guess.length() == n && (std::stoi(guess) / std::pow(10,n) != 0));
}

do
{
    std::cout << "Enter a " << n << "-digit Number: ";
    std::cin >> guess;
} while( !isValidInput(guess) );
&&不是正确的逻辑操作数。你需要使用| |

如果将逻辑重新表述为:

bool isValidInput(string const& guess)
{
   return (guess.length() == n && (std::stoi(guess) / std::pow(10,n) != 0));
}

do
{
    std::cout << "Enter a " << n << "-digit Number: ";
    std::cin >> guess;
} while( !isValidInput(guess) );

听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:请展示您的程序执行示例,并解释其行为与您想要的不同。很可能是std::pow导致了您的问题。您是否尝试调试代码以查看表达式的哪一部分产生的结果与您预期的不同?这就是如何缩小范围并最终解决错误的方法。也请查看。是的,我正在尝试阅读指南,谢谢。听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:请展示您的程序执行示例,并解释其行为与您想要的不同。很可能是std::pow导致了您的问题。您是否尝试调试代码以查看表达式的哪一部分产生的结果与您预期的不同?这就是如何缩小范围并最终解决错误的方法。也请退房。是的,我正在浏览指南,谢谢。是的,让它成为一个功能会有所帮助。不管怎样,谢谢。在我有足够的代表后,我会投票给你答案。谢谢。是的,让它成为一个功能会有帮助。不管怎样,谢谢。等我有足够的代表后,我会投票决定答案。谢谢。