如何在不使用 getline() 的情况下接受不同行中的整数输入值?

Posted

技术标签:

【中文标题】如何在不使用 getline() 的情况下接受不同行中的整数输入值?【英文标题】:How to accept integer input values in different lines without using getline()? 【发布时间】:2020-08-24 19:33:47 【问题描述】:

例如,我需要接受不同线上的两个矩形的尺寸。

我是这样尝试的:

int a1, b1, a2, b2;
char c;
cin >> a1 >> b1;
cin >> c >> a2 >> b2;

【问题讨论】:

如果不使用 getline (或类似的东西),您将无法做到这一点。你能解释一下为什么不能使用 getline 吗? 如果将其作为字符串接受,则无法对整数值执行任何操作。值将接受空格和不同矩形的不同行。 执行此操作的方法是将行作为字符串读取,然后将字符串转换为整数。有很多不同的方法可以将字符串转换为整数。 但是最简单的方法是写cin >> a1 >> b1 >> a2 >> b2; 如果输入在两行上,这将起作用,但如果输入在一行,三行或如何很多行。这真的有问题吗? operator>> 将换行符视为可忽略的空格,这就是为什么 cin >> c 无法跳过换行符。 【参考方案1】:

所以您希望用户以这种方式输入这 4 个整数

-10 0
30 40

并且您想拒绝所有其他格式的输入...

换句话说,输入必须包括:

4 int 整数

2 ' ' 个空格

2 '\n' 换行符

您可以修改我将要讨论的逻辑,以根据需要调整这些参数


这更像是一个解决问题的任务。无论如何,由于某种原因您不想使用getline,因此您必须自己管理大部分输入处理。

这是我的看法:

    逐个读取输入字符 (char ch),直到收到 四个单独的(由空格或换行符分隔)输入(可以是任何内容,包括 void ,之后可以进行验证)。使用std::stringstream (stringstream input) 读取整个输入;随着我们的进行,它将使输入验证更容易。有两个变量(unsigned spaceCount = 0;unsigned newlineCount = 0;)来控制循环终止。

    while (newlineCount + spaceCount != 4)
    
        ch = cin.get();
        input << ch;
    
        if (ch == ' ')
            ++spaceCount;
    
        if (ch == '\n')
            ++newlineCount;
    
    

    在继续之前,您需要像bool isInt(string num) 这样的函数来检查给定字符串是否为整数。您可以根据自己的需要制作一个。 *** 已经有一个线程:How to determine if a string is a number with C++? 只有当字符串可以放入 int 时,该函数才必须返回 true。

    然后您可以检查用户输入的隐藏宝石、非输入或垃圾邮件:

    bool inputFormatCorrect = true;
    if (spaceCount == 2 && newlineCount == 2)
    
        stringstream tmpInput;
        string tmpStr;
        tmpInput << input.str();
        for (int i = 0; i < 4; ++i)
        
            tmpInput >> tmpStr;
            if (!isInt(tmpStr))
            
                inputFormatCorrect = false;
                break;
            
        
    
    else
    
        inputFormatCorrect = false;
    
    

    检查完成后,您可以提取并显示您的整数 (int a1, b1, a2, b2;):

    if (inputFormatCorrect)
    
        input >> a1 >> b1 >> a2 >> b2;
        cout << "a1 = " << a1 << ", b1 = " << b1 << ", a2 = " << a2 << ", b2 = " << b2;
    
    else
    
        cout << "I don't like your style of inputting...";
    
    

    把它们放在一起:Live Demo我不确定你是否也想限制空格,但你可以修改逻辑删除所有出现的spaceCount,并在需要时将读取循环条件更改为while (newlineCount != 2)


那么,你真的是想让事情变得复杂吗?我们有标准输入是有原因的。

我还是喜欢

cin >> a1 >> b1 >> a2 >> b2;

不要给用户带来困难:

【讨论】:

以上是关于如何在不使用 getline() 的情况下接受不同行中的整数输入值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以在不使用 std::getline 的情况下调用 getline?

如何允许表单在不处理 Windows 消息的情况下接受文件删除?

如何在不离开我的网站的情况下接受信用卡付款? [关闭]

在不接受申请的情况下显示“喜欢页面”的内容

在不使用电子邮件的情况下接受 Testflight Beta 邀请?

在不使用 API 的情况下,是不是有任何可接受的方式来切割/重组 Django 查询集?