【问题标题】:Reading a value and use it without declaring an extra variable just as in Java's sc.next()读取一个值并使用它而不声明一个额外的变量,就像在 Java 的 sc.next() 中一样
【发布时间】:2014-12-25 16:54:35
【问题描述】:

在java中你可以这样做:

Scanner sc = new Scanner(System.in);
int total = 0;

for(int i = 0; i<something;i++){
    total+=sc.nextInt(); // <<< Doesn't require an extra variable
}

我的问题是:你能在 C 或 C++ 中做类似的事情吗?如果有,会更好吗?

这是我目前所做的:

int total;
int aux; // <<< Need an extra variable to read input
for(int i = 0; i<something;i++){
    scanf("%d",&aux);
    total+=aux; // <<< and add the read value here
}

【问题讨论】:

  • 在 c++ 中我们通常使用std::istream&amp; operator&gt;&gt;(std::istream&amp; is, T&amp; val) 而不是scanf()。后者是c-style,如果你真的想拥有它,请适当地标记你的问题!
  • 您好,感谢您的评论。我并不是特别在寻找 C 或 C++ 中的解决方案,只是一个效果最好的解决方案,我已经编辑了这个问题。
  • 一行:total+=atoi(fgets(aux, 256, stdin));

标签: c++ c scanf


【解决方案1】:

在 c++ 中从输入流中读取多个变量通常如下所示(关于您的示例):

int total = 0;
int aux;
while(std::cin >> aux) {
     // break on 'something' condition
     total += aux;
}

所以,我看不到如何在没有辅助变量的情况下实现它,它实际上接收从std::istream 读取的值,除非你自己提供一个包装类,那只是提供 java 类 行为。

“你能在 C 或 C++ 中做类似的事情吗?如果有,会更好吗?”

我怀疑在 c++ 中为std::istream 编写这样的包装类是否值得(您可以考虑使用@JerryCoffin's answer 中提到的std::accumulate() 算法)。

对于 语言,没有其他选择,我实际上可以看到/知道。

【讨论】:

    【解决方案2】:

    在 C++ 中执行此操作的明显方法是这样的:

    int total = std::accumulate(std::istream_iterator<int>(std::cin), 
                                std::istream_iterator<int>(), 
                                0);
    

    就目前而言,它可以从输入文件中读取所有ints,而不需要单独指定输入值的数量。如果您非常想要,您可以指定N,但至少根据我的经验,您不太可能想要这样。

    如果您真的想直接指定 N,处理这种情况的最简洁方法可能是定义一个类似于 std::accumulateaccumulate_n

    template <class InIt, class T>
    T accumulate_n(InIt in, size_t n, T init) {
        for (size_t i=0; i<n; i++)
           init += *in++;
        return init;
    }
    

    您可以像以前的版本一样使用它,但(显然)指定要读取的值的数量:

    int total = accumulate_n(std::istream_iterator<int>(std::cin), 
                             something,
                             0);
    

    我想我应该补充一点(特别是对于生产代码),您可能希望在上面的accumulate_n 定义中对模板参数添加一些约束。我也没有尝试对错误输入的可能性做任何事情,例如包含数字以外的内容,或者只是包含比指定数量少的项目。这些可以处理,但是我不记得Java是如何处理它们的;我可能需要做一些思考/研究来找出/弄清楚对这些问题的确切反应是最合适的。

    【讨论】:

    • "显而易见的方法..." 好吧,如果这真的 明显 是有争议的,但你完全正确的解决方案没有当然需要一个辅助变量。
    • @πάνταῥεῖ:这对来说似乎很明显...... :-)
    • “这对我来说似乎很明显。” 这似乎是经验问题 ;-) ...你能否改进你的答案,指出实际上可以构成@ 987654329@条件?
    • @πάνταῥεῖ:我添加了代码来显示读取固定数量的项目,就像原来的那样。
    • 我也一直在编辑我的答案。让我们看看这一切是如何发生的;-) ...
    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 2023-03-06
    • 2012-11-17
    • 2019-08-03
    • 2015-12-12
    • 1970-01-01
    • 2020-06-14
    • 2021-10-28
    相关资源
    最近更新 更多