floatingonair
floatingonair

Reputation: 53

Accept a binary string from user and check its validity in C?

I'm trying to ask a user to enter two binary sequences and check if they are valid. here is my code.

char seq1[8], seq2[8];
printf("Enter 1st 8-bit sequence: ");
scanf("%8s", seq1);
getchar();
printf("\nEnter 2nd 8-bit sequence: ");
scanf("%8s", seq2);
getchar();
printf("\n");
printf("%s\n", seq1);
printf("%s\n", seq2);

if(strlen(seq1) < 8 || strlen(seq2) < 8){
    printf("Error: must enter 8-bits\n");
    exit(1);
}
for(int i = 0; seq1[i]!='\0'; i++){
    if(seq1[i]>48||seq1[i]<49){
        printf("Error: non-binary detected\n");
        exit(1);
    }

}
for(int i = 0; seq2[i]!='\0'; i++){
    if(seq2[i]>48||seq2[i]<49){
        printf("Error: non-binary detected\n");
        exit(1);
    }

}

When printing the strings I get the second string (seq2) added onto the end of seq1, and it always comes back as "Non-binary detected" even if it's all 1's and 0's.

example

Upvotes: 1

Views: 749

Answers (2)

Govind Parmar
Govind Parmar

Reputation: 21542

There are a few things wrong with your code.

Let's try adding some extra information to your diagnostic messages:

if (strlen(seq1) < 8 || strlen(seq2) < 8) 
{
    printf("Error: must enter 8-bits; strlen(seq1) = %zu strlen(seq2) = %zu\n", strlen(seq1), strlen(seq2));
    exit(1);
}
for (int i = 0; seq1[i] != '\0'; i++)
{
    if (seq1[i] > 48 || seq1[i] < 49) 
    {
        printf("Error: non-binary detected (seq1[%d] = 0x%hhX)\n", i, seq1[i]);
        exit(1);
    }

}
for (int i = 0; seq2[i] != '\0'; i++) 
{
    if (seq2[i] > 48 || seq2[i] < 49) 
    {
        printf("Error: non-binary detected (seq2[%d] = 0x%hhX)\n", i, seq2[i]);
        exit(1);
    }
}

Right away we observe the error message: Error: non-binary detected (seq1[0] = 0x31). That's odd, because 0x31 is the ASCII code for the digit 1, which should be an acceptable binary digit. Reconsider your logic here:

seq1[i] > 48 || seq1[i] < 49 // In other words seq1[i] > '0' || seq1[i] < '1'

This statement will be true if seq1[i] contains a value that is greater than '0' or if it contains a value that is less than '1'. In other words, this statement will always be true and invoke the error handler. The correct conditional for what you want to test for is:

if(seq1[i] != '0' && seq1[i] != '1')

Also, if you're reading a string that's 8 characters long, you need a minimum of 9 characters in your buffer to hold the null-terminator.

Also, explicitly including != '\0' in a conditional is redundant.

Upvotes: 1

Bodo
Bodo

Reputation: 9855

Your check for wrong characters is wrong.

if(seq1[i]>48||seq1[i]<49)

This check is always true because every number is >48 or <49. But you want to check if the value is <48 or >49.

Correct would be

if(seq1[i]<48||seq1[i]>49)

or better readable as

if(seq1[i]<'0'||seq1[i]>'1')

Upvotes: 1

Related Questions