如果你要求一个整数并且用户输入“b”,你会在 C++ 中做啥?

Posted

技术标签:

【中文标题】如果你要求一个整数并且用户输入“b”,你会在 C++ 中做啥?【英文标题】:What do you do in C++ if you ask for an integer and the user inputs "b"?如果你要求一个整数并且用户输入“b”,你会在 C++ 中做什么? 【发布时间】:2020-08-10 11:11:51 【问题描述】:

我是静态类型 C++ 的新手。在 javascript 中,我可以先检查数据类型,但这似乎非常 complicated,答案似乎都暗示您没有“获得”该语言。

这是我用来测试 rand() 的代码,我遇到了将字符串转换为整数的问题:

int main()
std::string input;
    cout <<endl<< "What to do?"<<endl;
    cin >> input;
    if (input == "rand")
    
        cout << "what is the max?" << endl;
        cin >> input;
        int number;
        if (stoi(input) > 1) 
            number = stoi(input);
        
        else 
            number = 10;
            cout << "using 10"<<endl;
        
        cout << rand() % stoi(input);
        return main();
    

所以在 Javascript 中,我只会检查输入或结果的类型,但人们在 C++ 中会做什么?

不允许在 cmets 中说谢谢,所以我在这里说谢谢!

【问题讨论】:

不要检查输入的类型(无论如何它都会是一个字符串),检查它的值是否可以通过stoi 转换为有效的整数。对此提出了解决方案here。 问题不是关于std::atoi(它不执行任何检查),而是关于std::stoi(以及扩展名std::strtoi)。 部分问题是您认为什么是有效数字? stoi 有自己的定义,如前所述,如果不满足,它会抛出异常。如果stoi 没有做你想做的事,那么只需在input 上执行你自己的测试,也许使用正则表达式。 您在两个位置设置了number,但它从未使用过。可能应该只调用一次stoi(input),然后用它来设置number,然后在代码中那个位置之后使用数字。 【参考方案1】:

好吧,让我们试试会发生什么:https://godbolt.org/z/1zahbW

如您所见,std::stoi 如果您向其传递无效输入或其输入超出范围,则会引发异常。

但是,您应该注意 std::cin &gt;&gt; some_string; 有点不明显,因为它读取的是第一个“单词”,而不是一行或类似的内容,并且 std::stoi (再次)做同样的事情.

一种执行检查的方法,可能是这样的:

#include <string>
#include <iostream>

int main()
    std::cout << "Please give me a number: " << std::flush;

    std::string input;
    std::getline(std::cin, input);
    try 
        auto value = std::stoi(input);
        std::cout << "Thanks for the " << value << " (but the string was \"" << input << "\")\n";
     catch(std::invalid_argument const&) 
        std::cout << "The provided value is not an integer\n";
     catch(std::out_of_range const&) 
        std::cout << "The provided value is out of range\n";
    

https://godbolt.org/z/rKrv8G

请注意,这会将" 42 xyz" 解析为42。如果这对您的用例来说是个问题,您可能希望直接使用std::strtoi,或者在解析之前检查您的输入是否有效(例如,使用regex)

【讨论】:

【参考方案2】:

对于documentation of std::stoi,它会抛出一个std::invalid_argument

您可以做的是将您的std::stoi 调用放在try 中,然后捕获std::invalid_argument,但我个人不会这样做。

相反,检查输入的第一个字符是否是int 会更好(很可能),因为如果是一个,它可以简单地被std::stoi 解析。

您可以通过例如执行以下操作:

int max = 0;
std::string input;
std::cin >> input;

if(std::isdigit(input[0]))
  max = std::stoi(input);

编辑:请注意,这不会尊重数字太大的情况,要处理这种情况,您需要额外检查。

【讨论】:

如果您的输入大于最大整数值,这仍可能引发异常。它还将传递诸如“42chickens”之类的值。 @gha.st 是的,整数溢出的公平点,您可以为此添加额外的检查。对于 '42chicken' 的情况,我实际上想从那里解析 42,因为由用户输入正确的数字(按要求)。所以这些尝试通常是为了让程序行为不端而进行的测试,而这里的情况并非如此。 这个答案对我来说是最容易理解的,我不知道 isdigit,这对我来说似乎很直观。我可以想象制作一个简单的函数来检查输入是否完全是数字或包含非数字字符。 @sheepdeets 请注意,正如 gha.st 所提到的,这不是处理潜在整数溢出的情况。您需要对其进行额外检查。

以上是关于如果你要求一个整数并且用户输入“b”,你会在 C++ 中做啥?的主要内容,如果未能解决你的问题,请参考以下文章

第三章课后练习题

第六届蓝桥杯java b组第8题

一道C语言作业题,让你编写随机生成10以内的整数,并且自己输入计算结果的程序,我编写了一些,求教!!

已知两个整数a,b,且a+b=c,要求输入:a,b; 输出:c

C#while循环不起作用[关闭]

Eoj 2140