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 |
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
Are you new to LinuxQuestions.org? Visit the following links:
Site Howto |
Site FAQ |
Sitemap |
Register Now
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
|
 |
02-24-2004, 01:06 PM
|
#1
|
Member
Registered: Nov 2002
Location: brooklyn NYC
Distribution: gentoo
Posts: 212
Rep:
|
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
|
|
|
02-24-2004, 01:24 PM
|
#2
|
Member
Registered: Sep 2003
Distribution: Slackware 10 w/ Kernel 2.6.8
Posts: 176
Rep:
|
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';
}
|
|
|
02-24-2004, 01:36 PM
|
#3
|
Member
Registered: Nov 2002
Location: brooklyn NYC
Distribution: gentoo
Posts: 212
Original Poster
Rep:
|
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
|
|
|
02-24-2004, 01:57 PM
|
#4
|
Member
Registered: Nov 2002
Location: brooklyn NYC
Distribution: gentoo
Posts: 212
Original Poster
Rep:
|
seems like iostream.h is part of c++
i'm working in std C
|
|
|
02-24-2004, 02:01 PM
|
#5
|
Member
Registered: Sep 2003
Distribution: Slackware 10 w/ Kernel 2.6.8
Posts: 176
Rep:
|
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');
}
|
|
|
02-24-2004, 03:04 PM
|
#6
|
Senior Member
Registered: Nov 2000
Location: Seattle, WA USA
Distribution: Ubuntu @ Home, RHEL @ Work
Posts: 3,892
Rep:
|
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)
|
|
|
02-24-2004, 03:22 PM
|
#7
|
Senior Member
Registered: Jan 2004
Location: Oregon, USA
Distribution: Slackware
Posts: 1,246
Rep:
|
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;
}
|
|
|
02-24-2004, 03:30 PM
|
#8
|
Member
Registered: Sep 2003
Distribution: Slackware 10 w/ Kernel 2.6.8
Posts: 176
Rep:
|
itsme86,
what header file do you need for that?
|
|
|
02-24-2004, 03:55 PM
|
#9
|
Senior Member
Registered: Jan 2004
Location: Oregon, USA
Distribution: Slackware
Posts: 1,246
Rep:
|
stdlib.h -- I've never come across a compiler that doesn't have it (the header file or the function.)
|
|
|
02-24-2004, 05:34 PM
|
#10
|
Member
Registered: Nov 2002
Location: brooklyn NYC
Distribution: gentoo
Posts: 212
Original Poster
Rep:
|
thanks all
i'd been stimied by this for a while now
still need a better book.
|
|
|
02-24-2004, 05:59 PM
|
#11
|
Senior Member
Registered: Jan 2004
Location: Oregon, USA
Distribution: Slackware
Posts: 1,246
Rep:
|
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.
|
|
|
02-25-2004, 02:24 AM
|
#12
|
Member
Registered: Dec 2003
Distribution: Openwall, ~LFS
Posts: 128
Rep:
|
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.
|
|
|
All times are GMT -5. The time now is 02:35 AM.
|
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.
|
Latest Threads
LQ News
|
|