2016-06-07 44 views
-3

问题是在一个输入行中打印所有整数的总和。如果任何输入无效打印“无效”。 这是代码 - 与代码>C++ Code Link打印总和,如果所有输入有效,否则在C++中打印“无效”

的问题是,它不一样,如果输入> 9

。如何,我应该接近这里产生输出?

input : 1 2 3 14 
output : 11 //which is wrong 
input : 1 a 2 b 
output : Invalid
+0

请避免张贴链接到外部网站。编辑您的问题并将代码粘贴到您的问题中。 –

+0

@BarmakShemirani告诉人们在这里粘贴代码通常会产生OT代码转储。最好告诉他们改为发布[mcve]。 –

+0

你是什么意思'上面'输入给你一个编译错误?你在说什么?你如何定义有效的?你发布的输入编译得很好。 –

回答

1

在你的代码的第16行:

for(int i = 0 ; i < v.size() ; ++i) 

你比较i,这是一个有符号整数,以v.size(),这是无符号的类型size_t的。通过size_t更换int

for(size_t i = 0 ; i < v.size() ; ++i) 
+0

啊,是的!非常感谢。但是代码的问题在于,只有当输入是单个数字时才会产生输出。如果输入大于9,什么时候? –

+0

@krishnakeshav如果您有其他问题,请发布一个新问题。 –

0

在for循环使用unsigned,而不是int,它会解决这个问题。 您正在比较i与带符号int的unsigned v.size()

+0

这也适用。但是,我宁愿使用'size_t'。 –

0

您正在尝试将14存储在char中,这将不起作用!由于单个数字(0,1,2,3,4,5,6,7,8,9)被视为单个字符,所以一切都会正常,但14包含两个字符,因此首先会添加1在向量中,然后4。所以,答案11是正确的,因为1 + 2 + 3 + 1 + 4 = 11!您可以使用此解决方案:https://stackoverflow.com/a/289372/3185860strtok替代方法来分割输入字符串并获取数字(在这种情况下,' '将是您的分隔符)或以另一种方式解析输入以将数字存储在int变量中。

编辑:我知道你还是不明白你要做什么。花了2分钟时间来修改我下面评论的链接(https://stackoverflow.com/a/1321175/3185860)的回复以解决您的问题...下次,请花更多时间尝试自己解决问题。

#include <string> 
#include <vector> 
#include <sstream> 
#include <iostream> 
using namespace std; 

size_t ReadNumbers(const string & s, vector <int> & v) { 
    istringstream is(s); 
    int n; 

    for(int i=0; i<s.size(); i++) if(isalpha(s[i]) && s[i]!=' ') return 0; 

    while(is >> n) { 
     v.push_back(n); 
    } 

    return v.size(); 
} 

int main() { 
    int sum=0; 
    string s; 
    vector <int> v; 
    getline(cin, s); 
    ReadNumbers(s, v); 
    if(v.size()==0){ cout<<"Invalid\n"; return 0;} 
    else{ 
     for (int i = 0; i < v.size(); i++) { 
      sum = sum + v[i]; 
     } 
    } 

    cout<<sum<<'\n'; 
    return 0; 
} 
+0

你能告诉我示例代码吗? –

+0

看看我在答案中发布的链接。你将不得不将整个输入存储在一个字符串中(不是字符向量),然后按照链接所说的做,而不是' - ',你会得到'',并且当你找到一个数字时,将它转换为int并将其添加到总和中。 –

+0

这个答案做你想做的:http://stackoverflow.com/a/1321175/3185860 –