evoq
evoq

Reputation: 3

Int to Char array(part sums)

I have problem with "tab" output. My program is going to show part sums. I want to save those part sums in tab array but it shows only first sum.

here is code I wrote:

const char numbers[] = { "1 2 3 4" };
cout << numbers << endl;
for (int i = 0; i < strlen(numbers); ++i)
{
    if (numbers[i] != ' ') cout << numbers[i] << endl;  
}
int sum = 0;
char tab[20];
for (int i = 0; i < strlen(numbers); ++i){
    if (numbers[i] != ' ') {
        sum += atoi(&numbers[i]);
        _itoa_s(sum,&tab[i],sizeof(tab),10);
    }
}
cout << tab;
_getch();
return 0;

How I can make it to show proper part sums like: 1 3 6 10

Upvotes: 0

Views: 213

Answers (4)

Vlad from Moscow
Vlad from Moscow

Reputation: 311126

Your code has several problems. The first one is that function atoi will return an error because is will consider all string starting from &numbers[i] till the terminating zero. The other problem is that this in expression

_itoa_s(sum,&tab[i],sizeof(tab),10);

using tab[i] is incorrect.

Try the following code.

#include <iostream>
#include <cstring>
#include <cctype>
#include <cstdio>

//...
const char numbers[] = { "1 2 3 4" };

char tab[20];

char *p = tab;

int sum = 0;
for ( size_t i = 0, n = std::strlen( numbers ); i < n; i++ )
{
    if ( std::isdigit( numbers[i] ) )
    {
        sum += numbers[i] - '0';
        p += std::sprintf( p, "%d ", sum );
    }
}

std::cout << tab << std::endl;

At least I got output

1 3 6 10

Also it would be better to use std::istringstream instead of the for loop where you are extracting digits.

Upvotes: 0

smttsp
smttsp

Reputation: 4191

Firstly, cout << tab; prints only the first element.

Secondly, instead of writing the result to tab[i], create int cnt = 0; _itoa_s(sum,&tab[cnt],sizeof(tab),10); cnt++ By that way, you won't have empty characters in you tab array.

Thirdly, you can keep int tab[20], rather than to keep in char tab[].

Forthly, int num_elem = sizeof(numbers)/sizeof(numbers[0]);(as said above).

Upvotes: 0

tinkertime
tinkertime

Reputation: 3042

sizeof shows the size of the array in bytes, not the number of elements in the array.

Something like this will give you the number of elements:

int num_element = sizeof(numbers)/sizeof(numbers[0]);

Or a full solution:

const char numbers[] = { "1 2 3 4" };
int num_elements = sizeof(numbers)/sizeof(numbers[0]);
cout << numbers << endl;
for (int i = 0; i < num_elements; ++i)
{
    if (numbers[i] != ' ') cout << numbers[i] << endl;  
}
int sum = 0;
char tab[20];
for (int i = 0; i < num_elements; ++i){
    if (numbers[i] != ' ') {
        sum += atoi(&numbers[i]);
        _itoa_s(sum,&tab[i],sizeof(tab),10);
    }
}
cout << tab;
_getch();
return 0;

Although the above should work after replacing num_element into your for loops, I suggest you looking into a std::array or std::vector

Upvotes: 1

quantdev
quantdev

Reputation: 23813

You are not retrieving the size of your arrays here.

Use SIZEOF_ARRAY to get the size of numbers in C.

But you tagged C++, so consider using std::array<> instead of a C-style array (it will expose the size of the array for you)

Upvotes: 0

Related Questions