如果用户输入空格 ' '
或输入 \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()
和控制台应用程序实现?
答案 0 :(得分:8)
你实际上有三个问题,这些问题在开始时不能彼此独立区分,但是一旦你应用下面的推理,它就会变得清晰:
while (in != '\n' || in != ' ')
这是错的!你可能意味着&&
。
(A != B || A != C)
总是为真(假设B
和C
不同,因为它们在您的示例中),因为A
不可能相等他们两个在同一时间。
此外,你在错误的地方检查这个。你这样做了:
你看到你如何检查输入#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();
}
复制并不好,但是一旦逻辑正确,你就可以随心所欲地摆弄它。
最后,即使使用此代码,您可能会因终端中的行缓冲而遇到问题:您的程序运行正常,但,因为您的字符通常默认情况下不会发送到程序提供整行,对按压空间的行为没有“实时”/“即时”反应。只有当你点击输入时,你的终端最终提交给你的程序的所有那些字符,此时积压空间触发循环退出;这使得看起来就像你的程序只是在换行条件下终止,但事实并非如此。如果你从程序中生成了一些输出,看看它在退出之前实际处理了多少个字符,你可能已经发现了这一点。
您可以通过关闭终端模拟器中的行缓冲来解决此问题,或者通过删除使用空格来终止循环的功能来解决此问题,而只需依赖换行符 - 后者就是惯例,因此您无需询问用户可以专门配置他们的终端来运行你的程序:它在所有通常情况下都已正常运行。
重要的是不要假设,如果为问题1应用解决方案A不会立即使您的程序完美运行,那么解决方案A必定是错误的。您应该考虑到您还有未知问题2和3的可能性。
保持开放的心态并收集证据非常重要,例如从程序中编写输出以跟踪其执行......或使用调试器逐步完成并分析它在做什么。据我所知,除了粗略的经验观察之外,你还没有真正收集任何关于你的计划执行情况的证据。
答案 1 :(得分:3)
记住Lightness's great answer时,应该注意的是,您正在读取单个以空格分隔的标记,内置的格式化I / O运算符已经这样做了。例如,operator>>()
旨在提取输入的标记(比如一个数字),直到它到达空格字符和换行符的空格。
更简洁的方法是使用标准库中的标准算法和类,例如std::istream_iterator
和std::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()
将遍历字符,将其转换为整数,并累积其总和。