我正试图要求用户输入两个二进制序列,并检查它们是否有效。这是我的代码。
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,它也总是以“未检测到二进制”的形式返回。
答案 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'
是多余的。