LinuxQuestions.org
Download your favorite Linux distribution at LQ ISO.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 02-24-2004, 01:06 PM   #1
ocularbob
Member
 
Registered: Nov 2002
Location: brooklyn NYC
Distribution: gentoo
Posts: 212

Rep: Reputation: 30
C making an int from a string of numbers


i need to make a tiny program that will pass a command line argument that is
a number between 0 - 255 to a function that needs an int.

i've not figured out how to convert a string of numbers into and int.
i hope that makes sense.

so if i run the program like:

$ program 255

i want to be able to set

int n = 255;

yes i know nothing

thanks
 
Old 02-24-2004, 01:24 PM   #2
chewysplace
Member
 
Registered: Sep 2003
Distribution: Slackware 10 w/ Kernel 2.6.8
Posts: 176

Rep: Reputation: 30
read in the numbers represented like letters. then take the ASCII value of it and subtract 48 from it.

bit of codege for you to mess with:

#include<iostream.h>

int main(int argc, char argv)
{
cout << (int)'0' << '\n';
}
 
Old 02-24-2004, 01:36 PM   #3
ocularbob
Member
 
Registered: Nov 2002
Location: brooklyn NYC
Distribution: gentoo
Posts: 212

Original Poster
Rep: Reputation: 30
so i set it up like this

main(int argc, char argv)
{
startup(); \* defined elsewhere *\
cout << (int)'0' << '\n';
aPad_WriteInt(stem, GPMOD, 2, argv); \* where im using the arg as an int*\
aIO_MSSleep(io, 400, NULL);
shutdown(); \* defined elsewhere *\
}

kindof irrelevant since i don't seem to have iostream.h on my system.
looking into that now.

thanks
 
Old 02-24-2004, 01:57 PM   #4
ocularbob
Member
 
Registered: Nov 2002
Location: brooklyn NYC
Distribution: gentoo
Posts: 212

Original Poster
Rep: Reputation: 30
seems like iostream.h is part of c++
i'm working in std C
 
Old 02-24-2004, 02:01 PM   #5
chewysplace
Member
 
Registered: Sep 2003
Distribution: Slackware 10 w/ Kernel 2.6.8
Posts: 176

Rep: Reputation: 30
sory, iostream.h is a C++ function. using stdio.h and printf() should work though. it would be something like:

#include<stdio.h>

int main(int argc, char argv)
{
printf("%d\n", (int)'0');
}
 
Old 02-24-2004, 03:04 PM   #6
jtshaw
Senior Member
 
Registered: Nov 2000
Location: Seattle, WA USA
Distribution: Ubuntu @ Home, RHEL @ Work
Posts: 3,892
Blog Entries: 1

Rep: Reputation: 67
And in general, if you want to convert an array of char's to a number you can use strtol:

Code:
STRTOL(3)                  Linux Programmer's Manual                 STRTOL(3)



NAME
       strtol, strtoll, strtoq - convert a string to a long integer

SYNOPSIS
       #include <stdlib.h>

       long int
       strtol(const char *nptr, char **endptr, int base);

       long long int
       strtoll(const char *nptr, char **endptr, int base);

DESCRIPTION
       The  strtol()  function converts the initial part of the string in
       nptr to a long integer value according to the  given  base,  which
       must be between 2 and 36 inclusive, or be the special value 0.

       The  string must begin with an arbitrary amount of white space (as
       determined by isspace(3)) followed by a single optional `+' or `-'
       sign.   If  base is zero or 16, the string may then include a `0x'
       prefix, and the number will be read in base 16; otherwise, a  zero
       base is taken as 10 (decimal) unless the next character is `0', in
       which case it is taken as 8 (octal).

       The remainder of the string is converted to a long  int  value  in
       the obvious manner, stopping at the first character which is not a
       valid digit in the given base.  (In bases above 10, the letter `A'
       in  either  upper  or lower case represents 10, `B' represents 11,
       and so forth, with `Z' representing 35.)

       If endptr is not NULL, strtol() stores the address  of  the  first
       invalid  character  in  *endptr.   If there were no digits at all,
       strtol() stores the original value of nptr in *endptr (and returns
       0).   In  particular, if *nptr is not `\0' but **endptr is `\0' on
       return, the entire string is valid.

       The strtoll() function works just like the strtol()  function  but
       returns a long long integer value.

RETURN VALUE
       The strtol() function returns the result of the conversion, unless
       the value would underflow or overflow.  If  an  underflow  occurs,
       strtol()  returns  LONG_MIN.   If  an  overflow  occurs,  strtol()
       returns LONG_MAX.  In both cases, errno is set  to  ERANGE.   Pre-
       cisely  the same holds for strtoll() (with LLONG_MIN and LLONG_MAX
       instead of LONG_MIN and LONG_MAX).

ERRORS
       ERANGE The resulting value was out of range.

       EINVAL (not in C99) The given base contains an unsupported  value.

       The implementation may also set errno to EINVAL in case no conver-
       sion was performed (no digits seen, and 0 returned).

NOTES
       In locales other than the "C" locale, also other  strings  may  be
       accepted.   (For  example,  the thousands separator of the current
       locale may be supported.)

       BSD also has

           quad_t
           strtoq(const char *nptr, char **endptr, int base);

       with completely analogous definition.  Depending on  the  wordsize
       of  the  current architecture, this may be equivalent to strtoll()
       or to strtol().

CONFORMING TO
       strtol() conforms to SVID 3, BSD 4.3, ISO 9899  (C99)  and  POSIX,
       and strtoll() to ISO 9899 (C99) and POSIX 1003.1-2001.

SEE ALSO
       atof(3), atoi(3), atol(3), strtod(3), strtoul(3)



GNU                               2002-05-30                         STRTOL(3)
 
Old 02-24-2004, 03:22 PM   #7
itsme86
Senior Member
 
Registered: Jan 2004
Location: Oregon, USA
Distribution: Slackware
Posts: 1,246

Rep: Reputation: 59
The atoi() function is probably what you're looking for. Here's an example:

int main(int argc, char *argv[])
{
int n;

if(argc != 2)
puts("Usage: myprog <number>");
else
n = atoi(argv[1]);

return 0;
}
 
Old 02-24-2004, 03:30 PM   #8
chewysplace
Member
 
Registered: Sep 2003
Distribution: Slackware 10 w/ Kernel 2.6.8
Posts: 176

Rep: Reputation: 30
itsme86,

what header file do you need for that?
 
Old 02-24-2004, 03:55 PM   #9
itsme86
Senior Member
 
Registered: Jan 2004
Location: Oregon, USA
Distribution: Slackware
Posts: 1,246

Rep: Reputation: 59
stdlib.h -- I've never come across a compiler that doesn't have it (the header file or the function.)
 
Old 02-24-2004, 05:34 PM   #10
ocularbob
Member
 
Registered: Nov 2002
Location: brooklyn NYC
Distribution: gentoo
Posts: 212

Original Poster
Rep: Reputation: 30
thanks all

i'd been stimied by this for a while now

still need a better book.
 
Old 02-24-2004, 05:59 PM   #11
itsme86
Senior Member
 
Registered: Jan 2004
Location: Oregon, USA
Distribution: Slackware
Posts: 1,246

Rep: Reputation: 59
Here's a hard way of doing it. I wrote this just to challenge myself and because, yes, I'm that bored.

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int my_atoi(char *str)
{
  char *p;
  int rv = 0, mult = 1, neg = 1;

  if(*str == '-')
  {
    p = ++str;
    neg = -1;
  }
  else
    p = str;

  while(isdigit(*p))
    p++;

  p--;

  while(p >= str)
  {
    rv += (*p - '0') * mult;
    mult *= 10;
    p--;
  }

  return rv * neg;
}

int main(int argc, char *argv[])
{
  if(argc != 2)
  {
    puts("Usage: myprog <number>");
    return 1;
  }

  printf("stdlib's atoi(): %d\n", atoi(argv[1]));
  printf("my my_atoi(): %d\n", my_atoi(argv[1]));

  return 0;
}
itsme@dreams:~/C$ ./myatoi 37
stdlib's atoi(): 37
my my_atoi(): 37
itsme@dreams:~/C$ ./myatoi -37
stdlib's atoi(): -37
my my_atoi(): -37
itsme@dreams:~/C$ ./myatoi -37.3
stdlib's atoi(): -37
my my_atoi(): -37
itsme@dreams:~/C$ ./myatoi -37.8
stdlib's atoi(): -37
my my_atoi(): -37
itsme@dreams:~/C$

Why 37? I don't know. Should work fine though with most any number that's less than INT_MAX (positive or negative). It's not a very "safe" function though. For instance, the 'rv' and 'mult' variables might overflow if the string of digits is substantially long.

The basic premise is simple. Start with the right-most digit and every time you move left through the string multiply the 'mult' variable by 10. So in the 1's place the digit is multiplied by 1, the 10's place gets multiplied by 10, and so on.

So in the examples above, 'rv' ends up being 7 + 30.

Last edited by itsme86; 02-24-2004 at 06:21 PM.
 
Old 02-25-2004, 02:24 AM   #12
cjcuk
Member
 
Registered: Dec 2003
Distribution: Openwall, ~LFS
Posts: 128

Rep: Reputation: 15
As some advice, do not use atoi(3), but instead the strto*(3) functions -- as noted in the manual pages, atoi(3) does not support proper error checking on it's return value.
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
converting a int to string irfanhab Programming 6 07-30-2005 09:40 PM
C++ std::string to int Slaxx Programming 1 10-30-2004 10:03 PM
int to string+sendto pantera Programming 3 08-19-2004 07:19 PM
string to int BadTaste Programming 11 08-18-2004 10:23 AM
string to int in C h/w Programming 2 12-05-2003 03:47 PM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 03:12 PM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration