2013-06-27 5 views
-1

У меня есть строка C++ в моем коде, который, как:Сумма всех целых чисел в строки C++

"1 2 3 4 5 6 7 8" 

Я знаю, что строка состоит из целых чисел, разделенных пробелом полукокса. Как я могу их суммировать?

Я довольно C++ новичок и в Java я бы просто сделать:

String str = "1 2 3 4 5 6 7 8"; 
int sum = 0; 


for (int i = 0; i < str.split(" ").length; i++ { 
    sum += Integer.parse(str.split(" ")[i]; 
} 

Как я могу сделать так же, как это с моей строки объекта в C++?

Некоторые люди предложили мне stringstream, но я до сих пор не могу понять этот объект, и мне нужно полностью прочитать строку, получая в ней каждую цифру.

Заранее благодарен!

Обновление: некоторые ребята хорошо пытались мне помочь, но все же это не работает. Возможно, из-за некоторой причуды моей проблемы, о которой я раньше не уточнил. Так вот он идет:

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 


int main() 
{ 
freopen("variable-exercise.in", "r", stdin); 

int sum = 0, start = 0; 
string line; 


while(getline(cin ,line)) { 
    istringstream iss(line); 

    while(iss >> start) { 
     sum += start; 
    } 

    cout << start << endl; 
    sum = start = 0; 
} 

return 0; 
} 

Ах, входной файл содержит следующее:

1 
3 4 
8 1 1 
7 2 9 3 
1 1 1 1 1 
0 1 2 5 6 10 

Таким образом, для каждой строки, программа должна напечатать сумму всех целых чисел в строке строки. Этот пример будет генерировать:

1 
7 
10 
21 
5 
24 

благодаря

ответ

5

Некоторые люди предложили мне stringstream, но я до сих пор не могу понять этот объект, и мне нужно прочитать строку целиком

Я думаю, вы были даны хорошие советы. С помощью std::istringstream вы можете просто читать значения один за другим, так как вы будете читать их со стандартного ввода (или любого другого входного потока).

Например:

#include <sstream> 
#include <string> 
#include <iostream> 

int main() 
{ 
    // Suppose at some time you have this string... 
    std::string s = "1 2 3 4 5 6 7 8 9 10"; 

    // You can create an istringstream object from it... 
    std::istringstream iss(s); 

    int i = 0; 
    int sum = 0; 

    // And read all values one after the other... 
    while (iss >> i) 
    { 
     // ...of course updating the sum each time 
     sum += i; 
    } 

    std::cout << sum; 
} 
+0

В чем причина явного построения 'std :: string'? –

+1

@ H2CO3: В частности, не было причин, я думал, что в какой-то момент OP может закончиться «строковым» объектом (возможно, каким-то образом сконструированным какой-то другой функцией) и хочет получить номера из него. –

+0

ОК, вижу, спасибо. –

0

Как это:

std::stringstream s("1 2 3 4 5 6 7 8 9"); 
int n = 0; 
int x; 
while (s >> x) 
    n += x; 

std::cout << n << std::endl; 

После правки:

cout << start << endl; 

Это неправильно, вы должны быть печати sum вместо:

cout << sum << endl; 
+0

Не работает:/См. Мое обновление, пожалуйста, – rodrigoalves

+0

@rodrigoalves (Что такое обновление? На ваш вопрос нет изменений). Ну, это ** должно ** работать. [Демонстрация.] (Http://ideone.com/OpIIPH) –

+0

Простите, я прокомментировал, прежде чем завершить обновление. Вот оно. Прости. – rodrigoalves

0

Я использовал код C для решения этой проблемы. Вот окончательное решение:

#include <stdio.h> 
#include <string.h> 

int main() { 
    char *c; 
    char line[100]; 
    int x, sum = 0; 

    while(gets(line)) { 
     for(c = strtok(line, " "); c ; c = strtok(NULL, " ")) { 
      sscanf(c, "%d", &x); 
      sum += x; 
     } 

     printf("%d\n", sum); 
     sum = 0; 
    } 

    return 0; 
} 

Надеюсь, это поможет любому, у кого может быть такая же проблема!