#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]+
Comments
Post a Comment