Heisenberg
Heisenberg

Reputation: 5299

Slicing string character correctly in C++

I'd like to count number 1 in my input, for example,111 (1+1+1) must return 3and 101must return 2 (1+1) To achieve this,I developed sample code as follows.

#include <iostream>
using namespace std;

int main(){
    string S;
    cout<<"input number";
    cin>>S;
    cout<<"S[0]:"<<S[0]<<endl;
    cout<<"S[1]:"<<S[1]<<endl;
    cout<<"S[2]:"<<S[2]<<endl;
    int T = (int) (S[0]+S[1]+S[2]);
    cout<<"T:"<<T<<endl;
    return 0;
}

But when I execute this code I input 111 for example and my expected return is 3 but it returned 147.

[ec2-user@ip-10-0-1-187 atcoder]$ ./a.out
input number
111
S[0]:1
S[1]:1
S[2]:1
T:147

What is the wrong point of that ? I am totally novice, so that if someone has opinion,please let me know. Thanks

Upvotes: 3

Views: 58

Answers (2)

eerorika
eerorika

Reputation: 238351

Since your goal is to count the occurrences of a character, it makes no sense to sum the characters together. I recommend this:

std::cout << std::ranges::count(S, '1');

To explain the output that you get, characters are integers whose values represent various symbols (and non-printable control characters). The value that represents the symbol '1' is not 1. '1'+'1'+'1' is not '3'.

Upvotes: 4

tenfour
tenfour

Reputation: 36896

It's because S[0] is a char. You are adding the character values of these digits, rather than the numerical value. In ASCII, numerical digits start at value 48. In other words, each of your 3 values are exactly 48 too big.

So instead of doing 1+1+1, you're doing 49+49+49.

The simplest way to convert from character value to digit is to subtract 48, which is the value of 0.

e.g, S[0] - '0'.

Upvotes: 5

Related Questions