【问题标题】:C: Checking an array contains only numbers in the range 0-7C:检查数组只包含 0-7 范围内的数字
【发布时间】:2014-01-23 19:16:19
【问题描述】:

我很难确保数组只填充 0-7 范围内的数字。 当我用范围之外的数字填充数组时,例如。 0 0 0 8 显示错误消息。但是,如果用户输入一个字母,我的程序就会崩溃。

 int array[4] = {0};  

 scanf("%d %d %d %d", &array[0], &array[1], &array[2], &array[3]);

 for(int i=0; i<4; i++)
    {
        if(isdigit(array[i]) && array[i]<8 && array[i]>=0)
        {
             // continue program
        }
        else
        {
            printf("Invalid entry.");
            break;
        }
    }

任何帮助将不胜感激。

【问题讨论】:

    标签: c arrays validation numeric


    【解决方案1】:

    少一个测试(比hacks的解决方案):

    if (array[i] & ~7) {
        invalid_input();
    } else {
        /* valid input */
    }
    

    如果你仍然有问题,那么问题可能出在其他地方?..

    【讨论】:

    • 非常好的 xtof pernod!
    • 感谢 Valter =) 你知道,这只是基本的位处理,因为 7 比 2 的幂小一,它可用于屏蔽..
    【解决方案2】:

    问题在于 isdigit() 用于测试字符是否为数字,并将类型转换为整数的字符作为参数,并且您传递的是整数。当您将整数 0 传递给它时,它实际上是十进制的 0,但是当您将字符 '0' 传递给它时,它是十进制的 48。由于 ascii 中的 '0' 是十进制的 48,所以从 ascii 转换为整数只需减去 48测试范围之前的输入字符(0 到 8 之间)

    char array[4] = {0};
    int i=0;
    scanf("%c %c %c %c", &array[0], &array[1], &array[2], &array[3]);
    for(i=0; i<4; i++)
    {
        if(isdigit(array[i]) && (array[i]-48) <= 7 && (array[i]-48) >= 0)
        {
             printf(" continue program");
        }
        else
        {
            printf("Invalid entry.");
            break;
        }
    }
        return(0);
    }
    

    【讨论】:

      【解决方案3】:

      试试这个

      if(array[i] >= 0 && array[i] < 8 ) {...}  
      

      无需检查isdigit,因为它适用于chars,不适用于ints 或float。

      【讨论】:

        【解决方案4】:
        1. 这可能是 scanf() 函数对非整数输入的抱怨。这 如果是这种情况,错误消息应该给出一些提示。
        2. 您已经将输入读取为数字,因此很可能是 isdigit() 将是错误的(0)。它需要一个字符输入。
        3. for(int i 看起来更像 C++ 而不是 C。你的编译器可能是 实际上是在 C++ 模式下编译的。
        4. 请注意,如果您输入一个无符号整数以 0 开头 并且 仅包含数字 0 到 7,C 可能 将其解释为 八进制 数。如果您输入类似 01234 它很可能被解读为十进制 1234 以外的其他值。

        【讨论】:

        • scanf("%d", ...) 读取十进制数字,忽略前导零并且不将它们视为特殊并且不知道 0x 前缀。 (strtod 在基数为 0 时读取 C 风格的数字,而在基数为 10 时仅读取小数。)此外,您的八进制理论并不能解释 OP 的问题。在 C99 中,允许在 for 中声明循环变量。
        • 我不是在谈论 0x...我在谈论 0...我只是为了他们的利益而指出,他们可能会因为无意中输入八进制而陷入麻烦(很多人有)价值。为了使其防弹,您可能必须读取字符串并将子字符串提供给 strtold() 或其他东西。
        • 将带有前导零的数字视为八进制的约定是一个潜在的陷阱,我同意,但scanf("%d") 不使用该约定。我提到0x 只是为了支持这个事实:如果它知道0 是八进制,它可能也会知道0x。无论如何,我认为 OP 的问题在于他没有显示的代码部分。
        【解决方案5】:

        您可以只搜索数组中的元素并验证它们是否在 0 到 7 之间。

        if(array[i]>=0 &&array[i]<=7)
        { 
            continue program
        }
        else
        . . .
        

        【讨论】:

          猜你喜欢
          • 2020-04-27
          • 2014-12-05
          • 2020-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 2015-11-28
          相关资源
          最近更新 更多