Convert string to integer sscanf or atoi?

Up vote 4 down vote favorite 1 share g+ share fb share tw.

Gcc 4.4.4 c89 What is better to convert a string to an integer value. I have tried 2 different methods atoi and sscanf. Both work as expected.

Char digits3 = "34"; int device_num = 0; if(sscanf(digits, "%d", &device_num) == EOF) { fprintf(stderr, "WARNING: Incorrect value for device\n"); return FALSE; } or using atoi device_num = atoi(digits); I was thinking that the sscanf would be better as you can check for errors. However, atoi doesn't doing any checking. Many thanks for any advice, c sscanf atoi link|improve this question edited Aug 6 '10 at 5:59Paul R48.9k43288 asked Aug 6 '10 at 2:29ant20097281060129 95% accept rate.

You have 3 choices: atoi: This is probably the fastest if you're using it in performance-critical code, but it does no error reporting. If the string does not begin with an integer, it will return 0. If the string contains junk after the integer, it will convert the initial part and ignore the rest.

If the number is too big to fit in int, the behavior is unspecified. Sscanf: Some error reporting, and you have a lot of flexibility for what type to store (signed/unsigned versions of char/short/int/long/long long/size_t/ptrdiff_t/intmax_t). The return value is the number of conversions that succeed, so scanning for "%d" will return 0 if the string does not begin with an integer.

You can use "%d%n" to store the index of the first character after the integer that's read in another variable, and thereby check to see if the entire string was converted or if there's junk afterwards. However, like atoi, behavior on integer overflow is unspecified. Strtol and family: Robust error reporting, provided you set errno to 0 before making the call.

Return values are specified on overflow and errno will be set. You can choose any number base from 2 to 36, or specify 0 as the base to auto-interpret leading 0x and 0 as hex and octal, respectively. Choices of type to convert to are signed/unsigned versions of long/long long/intmax_t.

If you need a smaller type you can always store the result in a temporary long or unsigned long variable and check for overflow yourself. Since these functions take a pointer to pointer argument, you also get a pointer to the first character following the converted integer, for free, so you can tell if the entire string was an integer or parse subsequent data in the string if needed. Personally, I would recommend the strtol family for most purposes.

If you're doing something quick-and-dirty, atoi might meet your needs. As an aside, sometimes I find I need to parse numbers where leading whitespace, sign, etc. are not supposed to be accepted. In this case it's pretty damn easy to roll your own for loop (for (x=0; (unsigned)*s-'0.

Scanf() family of functions return the number of values converted. So you should check to make sure sscanf() returns 1 in your case. EOF is returned for "input failure", which means that ssacnf() will never return EOF.

For sscanf(), the function has to parse the format string, and then decode an integer. Atoi() doesn't have that overhead. Both suffer from the problem that out-of-range values result in undefined behavior.

You should use strtol() or strtoul() functions, which provide much better error-detection and checking. They also let you know if the whole string was consumed. If you want an int, you can always use strtol(), and then check the returned value to see if it lies between INT_MIN and INT_MAX.

As an additional bonus for strtol etc if you set your base to 0 you get automatic choice of the conversion from octal, decimal or hexadecimal input. – Jens Gustedt Aug 6 '10 at 6:09.

To @R.. I think it's not enough to check errno for error detection in strtol call. Long strtol (const char *String, char **EndPointer, int Base) You'll also need to check EndPointer for errors.

If user enters 34abc and you pass them to atoi it will return 34. If you want to validate the value entered then you have to use isdigit on the entered string iteratively.

Combining R.. and PickBoy answers for brevity long strtol (const char *String, char **EndPointer, int Base) // examples strtol(s, NULL, 10); strtol(s, &s, 10).

I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.

Related Questions