问题:
编写一个程序来计算整数的加法并打印输出。
输入格式:
第1行:由空格分隔的整数
输出:
输出由一个整数组成,对应于加法,后跟一个新行。 第1行添加数字
示例输入和输出:
输入1:
3 4 5 6 7
输出1:
25
输入2:
3 5 a b 7
输出:
输入无效
所以,我尝试了很多方法,但似乎没有任何工作
这是我放弃之前的最后一次尝试
#include <iostream>
using namespace std;
int main(){
int i;
int sum=0;
cin>>i;
while(isdigit(i)){
sum+=i;
cin>>i;
}
if(!isdigit(i)) cout<<"Invalid Input";
else cout<<sum;
return 0;
非常感谢所有帮助过的人......
我意识到我正在以错误的方式使用isdigit ... 代码略有修改就是诀窍
最终解决方案:
#include <iostream>
using namespace std;
int main(){
char i;
int sum=0;
while(cin>>i){
if(!isdigit(i)) {
cout<<"Invalid Input";
return 0;
}
sum+=(i-'0');
}
cout<<sum;
return 0;
}
*让我解释一下我最终做了什么....我把所有输入都作为char 我让(cin&gt;&gt; i)确保读取输入直到EOL。
我添加了一个条件来检查我得到的输入是不是一个数字(如果发生这种情况,我会打印“无效输入”并打破循环..这样我会得到相当于char的int值('0'- i),将其添加到求和并继续循环直到循环结束并打印总和*
如果存在两位数字的另一种解决方案(仅适用于c ++ 11以后)
#include <iostream>
using namespace std;
int main(){
string i;
int sum=0;
while(cin>>i){
try{
sum+= stoi(i);
}
catch(...){
cout<<"Undefined";
return 0;
}
}
cout<<sum;
return 0;
}
答案 0 :(得分:0)
嗯,声明
cin>>i;
从标准输入流中读取一个数字。
的输入 3
得到整数值3
。
isdigit(i)
函数会检查i
是否为['0'-'9']
范围内的字符值,小数为[48-57]
。
要检查无效输入,您宁愿写
while(cin >> i) {
sum+=i;
}
答案 1 :(得分:0)
尝试这样的事情:
#include <iostream>
using namespace std;
int main(){
// Get the full line of input
string line;
getline(cin, line);
// Variables used to loop through your input
bool failed = false;
int sum = 0;
int place = 1;
// Start from the back keeping track of current place values
for (int i = line.length() - 1; i >= 0; i--) {
if (isdigit( line[i] )) {
// For digits we add the
sum += place * ((int) line[i] - 48); // Subtract 48 (It gives ASCII)
place *= 10; // Prepare for next digit
}
else if (line[i] == ' ') {
// Our delimiter
place = 1; // Prepare for next number
}
else {
// Not a space our a digit
cout << "invalid Input";
failed = true;
break;
}
}
if (!failed){
cout << sum;
}
return 0;
}
我们使用cin
而不是直的getline
来将整行作为字符串的输入,向后遍历,并在我们的总和中添加数字。
关于标题中的问题
在您的版本中,您遇到了一些问题,但最大的问题是您使用整数运行isdigit
,并且您获得的结果无效。如果你想检查cin到int和int的转换是否正常工作,你应该使用cin的内置failbit。
例如:
int i;
cin >> i;
输入:
hello
将激活cin中的failbit。您可以使用cin作为bool来检查它。
以下代码:
int i;
cin >> i;
while (cin){
cin >> i;
}
将继续将整数放入i中,直到它获得无效的int,如“hello”。
然而,这不会捕获一行的结尾,或者如果用户只按空格键而没有输入,那么它对于跟踪输入结束的位置没有用,因为cin
忽略一个空输入,并将继续等待。这就是我为此推荐getline
的原因。
答案 2 :(得分:0)
读取一个完整的行,然后逐个元素地解析它。阅读该行:
std::string line;
std::getline(cin, line);
要解析它,请创建一个std::istringstream
并从中读取:
std::istringstream in(line);
int val;
while (in >> val) {
// whatever
}
当循环退出时,请检查为什么退出:
if (in.eof())
// got through the full line, hit end of file
else
// stopped short, because something was wrong with the input
我