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

shi*_*zou -3 c++ syntax

我试图让这个输入回路停止,如果用户进入space ' 'enter \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;
        }
}
Run Code Online (Sandbox Code Playgroud)

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

Lig*_*ica 8

你实际上有三个问题,一开始就无法独立区分,但是一旦你应用下面的推理,它就会变得清晰:


I.布尔条件不正确

while (in != '\n' || in != ' ')
Run Code Online (Sandbox Code Playgroud)

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

(A != B || A != C)永远是真的(假设BC不同,就像你的例子中那样)因为A不可能同时将它们都相等.


II.程序逻辑的顺序错误

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

  • 将输入#0设置为'0'以使我们前进
  • 输入#0是否符合我的退出标准?(没有)
  • 输入#1
  • 处理输入#1
  • 输入#1是否符合我的退出标准?(没有)
  • 输入#2(说这是一个空格)
  • 处理输入#2
  • 输入#2是否符合我的退出标准?(是!)
  • 结束循环

你看到你如何检查输入#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();
}
Run Code Online (Sandbox Code Playgroud)

重复不是很好,但是一旦逻辑正确,你可以随心所欲地调整它.


III.你的终端具备行缓冲关

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

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


Bootnote - 一般建议

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

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