ch2-btoi (Binary to decimal)

Chapter_2     Exercise_2-3     otoi Automatic_Conversions     Exercise_2-4







btoi.c         download


#include <stdio.h> // for printf(), scanf()

#define LENGTH 50 // max length of binary string (8 bits per byte)

int btoi(char []); // binary (string) to decimal (integer)

int main()
{
char s[LENGTH];

printf("Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+\n");
scanf("%s", s);
printf("btoi(%s): %d\n", s, btoi(s));

return 0;
}

int btoi(char bin[]) // binary (string) to decimal (integer)
{
if (bin[0] == '\0') // empty string is not a number
{
printf("\"%s\" is not a valid number\n", bin);
return 0; // should handle the error with an exception as we cannot
} // signal the error here with a returned value
// here bin[] is not empty
int i = 0, n = 0, sign = 1;
char temp;

if (bin[i] == '-') // negative number
{
sign = -1;
i++; // skip optional sign
}
else if (bin[i] == '+') // positive number
{
i++; // skip optional sign
}

if (bin[i] == '0')
{
i++;
if (bin[i] == '\0')
{return n;} // return 0; // valid binary number
if (bin[i] == 'b' || bin[i] == 'B')
{i++;} // skip optional 0b or 0B
}
else if (bin[i] == 'o' || bin[i] == 'O')
{
temp = bin[i];
i++;
if (bin[i] == 'b' || bin[i] == 'B')
{
printf("\"%s\" is not a valid binary number\n", bin);
bin[i-1] = '0';
printf("Did you mean \"%s\"?\n", bin);
bin[i-1] = temp;
printf("Note the difference between 'o' or 'O' and '0' (zero)\n");
return 0;
}
}

if (bin[i] == '\0')
{ // "0b" or "0B" is not a valid binary number
printf("\"%s\" is not a valid binary number\n", bin);
return 0;
}

while (bin[i] != '\0')
{
if (bin[i] == '0' || bin[i] == '1')
{n = n*2 + (bin[i]-'0');}
else // not a binary number
{
printf("\"%s\" is not a valid binary number\n", bin);
return sign * n;
}

i++;
}

return sign * n;
}
/*
gcc btoi.c -o btoi
./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
+
"+" is not a valid binary number
btoi(+): 0

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
-
"-" is not a valid binary number
btoi(-): 0

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
+01
btoi(+01): 1

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
0b
"0b" is not a valid binary number
btoi(0b): 0

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
a
"a" is not a valid binary number
btoi(a): 0

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
123
"123" is not a valid binary number
btoi(123): 1

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
-14
"-14" is not a valid binary number
btoi(-14): -1

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
ob1 // letter 'o', not digit '0'
"ob1" is not a valid binary number
Did you mean "0b1"?
Note the difference between 'o' or 'O' and '0' (zero)
btoi(ob1): 0

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
0b1
btoi(0b1): 1

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
-0b101
btoi(-0b101): -5

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
11111111
btoi(11111111): 255

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
-0B100000000
btoi(-0B100000000): -256

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
0b+1 // write +0b1
"0b+1" is not a valid binary number
btoi(0b+1): 0

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
+0b1
btoi(+0b1): 1

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
0B-11 // write -0B11
"0B-11" is not a valid binary number
btoi(0B-11): 0

./btoi
Enter a binary number [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+
-0B11
btoi(-0B11): -3
*/





Note:  The regular_expressions [+-]?(0b)?[01]+ or [+-]?(0B)?[01]+ could be succinctly written [+-]?(0[bB])?[01]+









Chapter_2     Exercise_2-3     otoi BACK_TO_TOP Automatic_Conversions     Exercise_2-4



Comments

Popular posts from this blog

Contents

Blogger Page Margins in Contempo