Home > Net >  Slicing string character correctly in C
Slicing string character correctly in C

Time:04-22

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

CodePudding user response:

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'.

CodePudding user response:

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'.

  •  Tags:  
  • c
  • Related