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

问题描述 投票:3回答:1

例如,我需要在不同的行中接受两个矩形的尺寸。

我试过这样做。

int a1, b1, a2, b2;
char c;
cin >> a1 >> b1;
cin >> c >> a2 >> b2;
c++ logic cin
1个回答
0
投票

所以你要让用户输入这4个 整数 以这种方式。

-10 0
30 40

你要拒绝所有其他格式的输入... ...

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

  • 4 int 整数

  • 2 ' ' 空间

  • 2 '\n' 新线

你可以根据需要修改我将要讨论的逻辑来调整这些参数。.


这更像是一个解决问题的任务。总之,既然你不想使用 getline 由于某些原因,你将不得不自己管理大部分的输入处理。

这是我的看法。

  1. 读取输入字符(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;
    }
    
  2. 在继续之前,你需要一个类似于 bool isInt(string num) 来检查给定的字符串是否是一个 是否为整数. 你可以根据自己的需要自己做一个。Stackoverflow已经有一个关于这方面的帖子。如何用C++确定一个字符串是否是一个数字? 只有当字符串可以被放入到一个 int.

  3. 然后你可以检查用户输入是否有隐藏的宝石,非输入或垃圾邮件。

    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;
    }
    
  4. 一旦检查完成,你可以提取并显示你的整数 (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...";
    }
    
  5. 把所有的东西放在一起 Live Demo 我不确定你是否也想限制空格 但你可以修改逻辑,删除所有出现的空格 spaceCount 并将读取循环条件改为 while (newlineCount != 2) 如果需要的话


所以,你真的是想把事情搞复杂吗?我们之所以有 标准 输入.

我还是喜欢

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

而不是给用户刁难。

output1

output2

output3

output4

© www.soinside.com 2019 - 2024. All rights reserved.