atoi.c
K&R, p. 43
download
#include <stdio.h> // for printf(), scanf()
#define LENGTH 15 // max length of string
int atoi(char s[]); // string to integer
int main()
{
char s[LENGTH];
printf("Enter a decimal number [+-]?[0-9]+\n");
scanf("%s", s);
printf("atoi(%s): %d\n", s, atoi(s));
return 0;
}
int atoi(char s[]) // string to integer (decimal)
{
if (s[0] == '\0') // empty string
{ // not a valid decimal
printf("\"%s\" is not a valid number\n", s);
return 0; // should handle the error with an exception as we cannot
} // signal the error here with a returned value
// here s[] is not empty
int i = 0, n = 0, sign = 1;
if (s[i] == '-') // negative number
{
sign = -1;
i++; // skip optional sign
}
else if (s[i] == '+') // positive number
{
i++; // skip optional sign
}
if (s[i] == '\0')
{
printf("\"%s\" is not a valid decimal number\n", s);
return 0;
}
while (s[i] != '\0')
{
if (s[i] >= '0' && s[i] <= '9')
{n = n*10 + (s[i]-'0');}
else // not a valid decimal
{
printf("\"%s\" is not a valid decimal number\n", s);
return sign * n;
}
i++;
}
return sign * n;
}
/*
gcc atoi.c -o atoi
./atoi
Enter a decimal number [+-]?[0-9]+
0
atoi(0): 0
./atoi
Enter a decimal number [+-]?[0-9]+
-1
atoi(-1): -1
./atoi
Enter a decimal number [+-]?[0-9]+
+2
atoi(+2): 2
./atoi
Enter a decimal number [+-]?[0-9]+
a
"a" is not a valid decimal number
atoi(a): 0
./atoi
Enter a decimal number [+-]?[0-9]+
+
"+" is not a valid decimal number
atoi(+): 0
./atoi
Enter a decimal number [+-]?[0-9]+
-
"-" is not a valid decimal number
atoi(-): 0
./atoi
Enter a decimal number [+-]?[0-9]+
1.2
"1.2" is not a valid decimal number
atoi(1.2): 1
./atoi
Enter a decimal number [+-]?[0-9]+
-1.2
"-1.2" is not a valid decimal number
atoi(-1.2): -1
./atoi
Enter a decimal number [+-]?[0-9]+
32767 // SHRT_MAX (limits.h)
atoi(32767): 32767
./atoi
Enter a decimal number [+-]?[0-9]+
2147483647 // INT_MAX
atoi(2147483647): 2147483647
./atoi
Enter a decimal number [+-]?[0-9]+
2147483648 // INT_MAX + 1
atoi(2147483648): -2147483648 // INT_MIN (modulo 2 arithmetic)
./atoi
Enter a decimal number [+-]?[0-9]+
-2147483648 // INT_MIN
atoi(-2147483648): -2147483648
./atoi
Enter a decimal number [+-]?[0-9]+
-2147483649 // INT_MIN - 1
atoi(-2147483649): 2147483647 // INT_MAX (modulo 2 arithmetic)
*/
Note:
[+-]?[0-9]+ is a
regular_expression. [+-]? is an optional sign.
It means either + or
-, but not both,
zero or one time. [0-9]+
means one or more digits (in the range 0 ... 9).
Comments
Post a Comment