reading number

Just a quick question.

How do we convert 10,000 to 10000?
I read the number using char array from a file, and want to copy thearray to an integer variable. Is that possible?
icysmartyAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
MysidiaConnect With a Mentor Commented:
The answer is that the strategy works for an arbitrary positive integer inside the legitimate range for
integers.

It can trivially be extended to negative integers by handing the -.

Consider input digits
     D0   D1  D2  D3   D4

What does it mean for a digit to be in the  position on the far right?
Why it means that it is multiplied by 10^0

Second position is weighted as 10^1,  Third position from the right
is 10^2, etc.

Ok, What's num equal to after reading all four example digits then?

Well consider Num_[NNN] as a representation of num after the NNNth iterate

The first iterate of the loop is 0  what is Num after that?
Why:
Num_0 = 0*0 + D0

Guess what, it is in general true that for the algorithm:
Num_(i+1) = (Num_i * 10) + D_i+1

And:
Num_1 = Num_0 * 10 + D1 = D0 * 10 + D1
Num_2 = Num_1*10 + D2 = D0*100 + D1*10 + D2
Num_3 = Num_2*10 + D3 = D0*1000 + D1*100 + D2*10 + D3
Num_4 = Num_3*10 + D3 = D0*10000 + D1*1000 + D2*100 + D3*10 + D4

So if you let the four input digits in the example be
                D1 =  5
                D2  = 4
                D3  = 3
                D4   = 2

then the result is

num = 5*1000 + 4*100 + 3*10 + 2


0
 
MysidiaCommented:
Just the same way you convert "10000" to int representation 10000
if you don't use library calls.

like this:

while(x < array_size)
  num = num * 10;
  num = num + array[x];
  x = x + 1;
}

just add checks to skip commas.
x and num  start at zero
and 'array_size' should be the actual length of the string
0
 
MysidiaCommented:
er,

num = num + (array[x]-'0')

or if you prefer

num = num + charToDigit(array[x])


int charToDigit(char v)
{
  switch(v) {
     default: return 0; break;
     case '0': return 0;
     case '1': return 1;
     case '2': return 2;
     case '3': return 3;
...
  }
}
0
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
RogueAceCommented:
What's wrong with library calls?

#include <cstdlib> to get atoi and <ctypes> to get isdigit, if I recall correctly.

num=0;
for(unsigned int c=0; c < arraysize; c++){
  if( isdigit( myarray[c] )){
    num*=10;
    num += atoi(myarray[c]);
  }
}
0
 
MysidiaCommented:
The fact that atoi takes a pointer to a string as its parameter,
and that segment passes an invalid input to atoi()

Moreover, building a string just to use atoi() would be
wasteful, and there's no reason to go through all the
trouble involved.

int num = 0, x = 0;

while(x < array_size)
  if (!isdigit(x)) {
      /* Detect, skip invalid characters,  report such errors as per the needs
          of your situation*/
      continue;
  }
  num = num * 10;
  num = num + (array[x] - '0');
  x = x + 1;
}
0
 
icysmartyAuthor Commented:
Does this apply to 10,000 only? What if I have 12,345 and 56,123?
I am doing this

void read_byte( unsigned char byte)
{
    ....
    ....
    if(byte == 44)
    {}
    else
    array[i++] = byte;
}

The problem is I dunno how to make it display as an integer say 12345, instead of digit 1 digit 2 digit 3 digit 4 digit 5.
0
 
MysidiaCommented:
legitimate range of integers can be determined by #includ'ing  <limits.h>

the maximum value is INT_MAX
the minimum value is called INT_MIN
0
 
MysidiaCommented:
Err, oops technically:
 Num_(i+1) = (Num_i * 10) + D_i+1

should be more like
   Num_(i+1) = (Num_(i-1) * 10) + D_i
with initial condition  Num_(-1) = 0        [Since D0 is the first numbered digit]
0
 
icysmartyAuthor Commented:
I got the concept and has coded it according to the logic. Thank you.
0
 
RogueAceCommented:
Hmm, you're right about atoi. I forgot it took a c-style string instead of a character.

The short version of what Mysidia is saying, icysmarty, is that it will work for any reasonably-sized (i.e. under two billion) number.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.