检测用户是否输入空格或使用cin.get()输入条件

时间:2014-12-15 22:38:35

标签: c++ syntax

如果用户输入空格 ' '输入 \n,我试图让此输入循环停止空格部分似乎不起作用,即使我用in != ' '替换in != 32这是空间的ASCII代码。

#include<iostream>
using namespace std;

int main()
{
        int temp, cho = 0;
        char in = '0';

        while (in != '\n' && in != ' ')
        {
                in = cin.get();
                temp = in - '0';
                if (temp >= 0 && temp <= 9)
                        cho += temp;
        }
}

是否可以使用cin.get()和控制台应用程序实现?

2 个答案:

答案 0 :(得分:8)

你实际上有三个问题,这些问题在开始时不能彼此独立区分,但是一旦你应用下面的推理,它就会变得清晰:


予。布尔条件不正确

while (in != '\n' || in != ' ')

这是错的!你可能意味着&&

(A != B || A != C) 总是为真(假设BC不同,因为它们在您的示例中),因为A不可能相等他们两个在同一时间。


II。程序逻辑的顺序错误

此外,你在错误的地方检查这个。你这样做了:

  • 将输入#0设为'0'让我们前进
  • 输入#0是否符合我的退出标准? (无)
  • 输入#1
  • 处理输入#1
  • 输入#1是否符合我的退出标准? (无)
  • 输入#2(比如这是一个空格)
  • 处理输入#2
  • 输入#2是否符合我的退出标准? (YES!)
  • 结束循环

你看到你如何检查输入#2太晚了?它已经被“处理”了。在实施上述修复后,您将退出循环,但您已将该字符附加到cho

这个怎么样:

int temp, cho = 0;

// Get input for the first iteration
char in = cin.get();

while (in != '\n' && in != ' ')
{
    temp = in - '0';
    if(temp >=0 && temp <=9)//so only the ASCII of digits would be entered
        cho += temp;

    // Now get input for the next iteration
    in = cin.get();
}

复制并不好,但是一旦逻辑正确,你就可以随心所欲地摆弄它。


III。您的终端在

上启用了线路缓冲

最后,即使使用此代码,您可能会因终端中的行缓冲而遇到问题:您的程序运行正常,,因为您的字符通常默认情况下不会发送到程序提供整行,对按压空间的行为没有“实时”/“即时”反应。只有当你点击输入时,你的终端最终提交给你的程序的所有那些字符,此时积压空间触发循环退出;这使得看起来就像你的程序只是在换行条件下终止,但事实并非如此。如果你从程序中生成了一些输出,看看它在退出之前实际处理了多少个字符,你可能已经发现了这一点。

您可以通过关闭终端模拟器中的行缓冲来解决此问题,或者通过删除使用空格来终止循环的功能来解决此问题,而只需依赖换行符 - 后者就是惯例,因此您无需询问用户可以专门配置他们的终端来运行你的程序:它在所有通常情况下都已正常运行。


Bootnote - 一般建议

重要的是不要假设,如果为问题1应用解决方案A不会立即使您的程序完美运行,那么解决方案A必定是错误的。您应该考虑到您还有未知问题2和3的可能性。

保持开放的心态并收集证据非常重要,例如从程序中编写输出以跟踪其执行......或使用调试器逐步完成并分析它在做什么。据我所知,除了粗略的经验观察之外,你还没有真正收集任何关于你的计划执行情况的证据。

答案 1 :(得分:3)

记住Lightness's great answer时,应该注意的是,您正在读取单个以空格分隔的标记,内置的格式化I / O运算符已经这样做了。例如,operator>>()旨在提取输入的标记(比如一个数字),直到它到达空格字符和换行符的空格。

更简洁的方法是使用标准库中的标准算法和类,例如std::istream_iteratorstd::accumulate()

#include <iterator>
#include <string>
#include <iostream>
#include <numeric>

int main()
{
    typedef std::istream_iterator<std::string> iter_t;
    iter_t it(std::cin);
    int cho(0);

    if (it != iter_t{})
    {
        auto s = *it;
        cho = std::accumulate(std::begin(s), std::end(s), 0,
              [] (int v, unsigned char c) { return v + c - '0'; });
    }
    std::cout << cho;
}

std::istream_iterator在内部使用operator>>()std::accumulate()将遍历字符,将其转换为整数,并累积其总和。