【问题标题】:Why cout doesn't work? [closed]为什么 cout 不起作用? [关闭]
【发布时间】:2018-02-15 18:35:41
【问题描述】:

当我尝试像这样从控制台读取输入时:

6 6 4
1 1 1
2 1 1
1 2 1
2 2 1

使用以下代码片段,对于每行三元组,我只想计算 (n/a+1)*(m/a+1) 并将结果输出到控制台。

while(cin.get()!='\n'){
    int n=0, m = 0, a =0;
    cin >> n >> m >> a;

    cout <<(n/a+1) * (m/a+1) << endl;

}

但是,它不起作用,为什么?

【问题讨论】:

  • 您知道cin.get() 将从输入缓冲区中提取一个字符。那个角色将永远消失。如果要一次读取一行,请使用std::getlinestd::istringstream 进行提取。
  • 欢迎堆栈溢出。 “它不起作用”你能说出发生了什么吗?
  • shin 我回答了你的问题,你看到了吗?
  • FYI (n/a+1) * (m/a+1) 如果 nm 是 100,000 并且 a 是个位数,则会溢出。将乘法结果类型转换为long int sice m,n,a 是整数。喜欢这个(long int)((n/a+1) * (m/a+1))

标签: c++ loops io iostream cin


【解决方案1】:

这里:

while(cin.get()!='\n')

每次循环条件计算时,您都从标准输入中提取一个字符。

因此,当您尝试解析三元组时,该字符已被消耗。


使用std::getline()逐行解析输入,并从每一行中获取三元组。

例子:

#include <sstream>
#include <string>
#include <iostream>

int main() {
    std::string line;
    while (std::getline(std::cin, line))
    {
        std::istringstream iss(line);
        int n, m, a;
        if (!(iss >> n >> m >> a)) { break; } // error
        std::cout <<(n/a+1) * (m/a+1) << std::endl;
    }
    return 0;
}

输出:

4
4
6
6
9

PS:仅供参考,如果 nm 是 100,000 并且 a 是个位数,则 (n/a+1) * (m/a+1)溢出。将乘法结果类型转换为long int sice m,n,a 是整数,例如const_cast&lt;long int&gt;((n/a+1) * (m/a+1))

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多