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

标签 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

最佳答案

您的代码有一些问题。

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

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'。换句话说,此语句将始终 为真并调用错误处理程序。您要测试的正确条件是:

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

此外,如果您正在读取一个 8 个字符长的字符串,则您的缓冲区中至少需要 9 个字符来保存空终止符。

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

关于c - 接受来自用户的二进制字符串并检查其在 C 中的有效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54519760/

相关文章:

c - C 中默认调度程序的 pthread 良好值设置

android - JNI Android中的分配和释放问题

c - 字符串末尾的奇怪值

java - 在 x 个制表符后分割字符串

c - 如何打印 fread()?

PHP:如何快速将键=值文件拆分为关联数组

java - 我们什么时候应该在 String 字面量上使用 String 的 intern 方法

php - 使用 MySQL 和 PHP,从表中获取行,为行输入字母等级,然后更新表

c - 错误输入后程序崩溃 (C)

javascript - jQuery 在将表单填充到所有必填字段(如果为空)时添加类红色边框(填充除外)