接受用户的二进制字符串并在C中检查其有效性?

时间:2019-02-04 15:54:03

标签: c string input binary

我正试图要求用户输入两个二进制序列,并检查它们是否有效。这是我的代码。

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);
    }

}

打印字符串时,我将第二个字符串(seq2)添加到seq1的末尾,即使它全为1和0,它也总是以“未检测到二进制”的形式返回。

example

2 个答案:

答案 0 :(得分:0)

您检查错误的字符是错误的。

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

此检查始终为true,因为每个数字都是>48<49。但是您想检查值是<48还是>49

正确将是

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

或更好的可读性

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

答案 1 :(得分:0)

您的代码有些错误。

让我们尝试在诊断消息中添加一些额外的信息:

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);
    }
}

马上我们会看到错误消息:Error: non-binary detected (seq1[0] = 0x31)。这很奇怪,因为0x31是数字1的ASCII码,应该是可以接受的二进制数字。在这里重新考虑您的逻辑:

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

如果seq1[i]包含一个大于'0'的值,或者如果它包含一个小于'1'的值,则此语句为true。换句话说,此语句将始终为true,并调用错误处理程序。要测试的正确条件是:

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

此外,如果要读取的字符串长8个字符,则缓冲区中至少需要9个字符才能容纳空终止符。

此外,在条件中明确包含!= '\0'是多余的。