Andrei Gatej
Andrei Gatej

Reputation: 15

finding sum of numbers in a char array

I'm trying to find the sum of the numbers in a char array.

My code works for most cases. Example : a=dasn344wee22ee, the output is:366 - which is good

But when my char is,for example : andre54e5 the output should be 59, but the program displays: 108.

Can anybody tell me what the issue is?

#include <iostream>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
using namespace std;


int getnr(char a[], int i, int j)
{
    int counter = 0;
    char sir[1000];
    for (int x = i; x<j; x++)
    {
        sir[counter] = a[x];
        counter++;
    }
    return atoi(sir);

}
int main()
{
    char a[1000];
    int s = 0, inceput, finals;
    cin.getline(a, 255);
    for (int i = 0; i<strlen(a); i++)
    {
        if (isdigit(a[i]) )
        {
            if (i == strlen(a) - 1)
            {
                s += getnr(a, i, strlen(a));
            }

            for (int j = i + 1; j<strlen(a); j++)
            {
                if (!isdigit(a[j])  || j == strlen(a) - 1)
                {
                    s += getnr(a, i, j + 1);
                    i = j;
                    break;
                }
            }
        }
    }
    cout << s;
    return 0;
}

Upvotes: 0

Views: 1019

Answers (3)

Dash
Dash

Reputation: 308

The issue is within this part of code:

if (i == strlen(a) - 1)
{
   s += getnr(a, i, strlen(a));
}

Specifically, if your last number is a single digit (which it is), it will always return junk.

So, I would change to only convert the single char of the char array as a digit and at it to the int s.

Edit: For some reason when doing s+= a[i], I return junk. But, doing the following, does the trick:

if (i == strlen(a) - 1)
{
    string x;
    x[0] = a[i];
    int l = stoi(x);
    s += l;
}

I know that there's a much more effective way, but I'm not sure why s+= a[i] itself returns false numbers.

Upvotes: 0

Barmar
Barmar

Reputation: 782498

The problem is that getnr() doesn't add a null terminator to the sir array, so you're getting undefined behavior when you call atoi(sir).

int getnr(char a[], int i, int j)
{
    int counter = 0;
    char sir[1000];
    for (int x = i; x<j; x++)
    {
        sir[counter] = a[x];
        counter++;
    }
    sir[counter] = '\0';
    return atoi(sir);

}

Upvotes: 0

Stephan Lechner
Stephan Lechner

Reputation: 35164

In your function int getnr(char a[], int i, int j), you forgot to null-terminate string sir, such that atoi(sir) might yield a garbage value (actually the behaviour is undefined). The following should help:

int getnr(char a[], int i, int j)` {
    ...
    sir[counter] = '\0';
    return atoi(sir);
}

Upvotes: 1

Related Questions