2014-12-11 4 views
0

현재 사용자 입력 문자열을 가져 와서 개별적으로 int로 변환하고 합계를 계산하려고합니다.문자열에서 숫자의 합계 (문자열 개체 사용) C++

EX : 사용자가 "1234"를 입력하면 프로그램은 1 + 2 + 3 + 4를 수행하고 "10"을 표시해야합니다. 나는 많은 것을 시도했지만 여전히 서있는 것처럼 보인다.

C 문자열/문자열 개체와 가능한 경우 "istringstream()"을 사용하여이 코드를 만들려고합니다. (더 쉬운 방법이있는 경우 ...]

내가 잘못 뭐하는 거지

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

int main() 
{ 
    string digits; 
    int total = 0, num; 

    cout << "Enter a string of digits, and something magical will happen to them..." << endl; 
    cin >> digits; 

    for (int i = 0; i < digits.length(); i++) 
    { 
     cout << digits.at(i) << endl; 
     istringstream(digits.at(i)) >> num; 
     cout << num << endl; // Displays what came out of function 
     total += num; 
    } 

    cout << "Total: " << total << endl; 

    // Digitize me cap'm 
    // Add string of digits together 
    // Display Sum 
    // Display high/low int in string 
} 

: 여기

는 지금까지이 무엇인가? for 루프에서 수퍼 하이 숫자를 계속 가져 오는 이유는 무엇입니까? 더 효율적인 기능이 있어야합니까? 어떤 도움 주셔서 감사합니다 :)

+0

'istringstream (digits.at (i)를)'안도 컴파일, 어떤 컴파일러/표준 라이브러리를 사용하고 있습니까? – user657267

답변

1

for (int i = 0; i < digits.length(); i++) 
{ 
    cout << digits.at(i) << endl; 
    num = digits.at(i) - '0'; 
    assert(0 <= num && num <= 9); 
    cout << num << endl; // Displays what came out of function 
    total += num; 
} 

당신은 이제 stringstream 같은 복잡한 일을하지 않아도 하나의 숫자로 변환하기위한 것이어야한다.

num = ((int)digits.at(i))-((int) ('0')); 

당신은 빠른 코드를 alltogether해야합니다 : 또한 (권장하지 않음) istringstream(digits.substr(i, 1))

+2

빠른 답장을 보내 주셔서 감사합니다 (신성한 CRAP 모두 빠른 답변)! 나는 이것으로 갔다 - 나는 이것이 나의 교수가 찾고있는 것 중 가장 생각한다고 생각한다. 고맙습니다. Mohit ... Noob questions : assert() 0-9는 우리가 읽고있는 한자리 숫자입니까? 또한 '0'을 넣는 것의 의미는 무엇입니까? – HBPatrick

+0

나는 그것이 당신을 위해 일해서 기쁘게 생각합니다.어설 션은 모든 자릿수가 '0-9' 범위 내에 있는지 확인합니다 (그리고 그 입력에는 a, b 등의 문자가 포함되지 않습니다). ''0 ''은 0과 다를 수있는 '0'문자입니다. 대부분의 코딩 (예 : ANSI)에서 1, 2, 3 등의 코드가 계속됩니다. 따라서 문자에서 ''0 '을 빼면 해당 문자가 필수 자릿수로 변환됩니다. –

+0

'assert (0 <= num && num <= 9);을'isdigit (num) '로 바꾸면 더 나은 성능과보다 간결한 코드를 얻을 수 있습니다. – mookid

0

대신 istringstream (digits.at (I)) >> 납입을 사용할 수 있습니다, 변환이 방법을 사용해보십시오 . std::stollstd::string 변환

int main() 
{ 
    string digits; 

    cout << "Enter a string of digits, and something magical will happen to them..." << endl; 
    cin >> digits; 

    auto enteredNumber = std::stoll(digits); 
    auto total = digitSum(enteredNumber); 

    cout << "Total: " << total << endl; 
} 

기능 :

+0

그것은 특히 char를 사용하여 수학을 할 수 있다는 것을 고려할 때, 필요한 것보다 훨씬 더 많은 캐스팅을하고 있습니다. 다른 숫자보다 큰 '0'의 예기치 않은 경우에는 훨씬 더 많은 것들이 중단됩니다. – Mario

+0

여러 언어/컴파일러에서 작동하지 않는 habbits. 때로는 경고/오류를 피하기 위해 char에서 int 로의 명시적인 형 변환이 필요합니다. – MichaelCMS

+0

아, 일반적으로 더 좁은 유형 (예 :'int'에서'char')으로 잠재적으로 더 큰 값을 지정하는 경우에만 일반적으로 발생합니다. – Mario

0

나는 어떤 숫자의 자리 합 얻기위한 새로운 함수를 만들 것입니다 :

long long digitSum(long long number) 
{ 
    long long sum = 0; 
    while (number != 0) 
    { 
     sum += number % 10; 
     number /= 10; 
    } 
    return sum; 
} 

을 그리고 당신은 주()에서 할 수 있습니다 ~ long long

이렇게하면 사용자가 입력 할 수있는 숫자가 제한됩니다. 다른 접근 방식은 이미 다른 응답과 마찬가지로 문자의 속성을 사용하는 것입니다 (숫자가 아님).

'0'의 값은 48입니다. '1'의 값은 49입니다. 그래서 당신이 '1' - '0' 할 때 결과는 1입니다. 이것은 정확히 char 표현의 숫자 값입니다. 이 같은 주 보이게

long long digitSum(string numberStr) 
{ 
    long long sum = 0; 
    for (int i = 0; i < numberStr.length(); i++) 
    { 
     auto charValue = numberStr.at(i) - '0'; 
     sum += charValue; 
    } 
    return sum; 
} 

:

이 당신이 이런 식으로 뭔가 할 수 있다는 것을 의미

int main() 
{ 
    string digits; 

    cout << "Enter a string of digits, and something magical will happen to them..." << endl; 
    cin >> digits; 

    auto total = digitSum(digits); 

    cout << "Total: " << total << endl; 
}