ch2-atoi (String to integer)

Chapter_2     Exercise_2-2 atou     Exercise_2-3







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).









Chapter_2     Exercise_2-2 BACK_TO_TOP atou     Exercise_2-3



Comments

Popular posts from this blog

Contents

Blogger Page Margins in Contempo