【问题标题】:How to limit a user input如何限制用户输入
【发布时间】:2021-06-19 17:27:34
【问题描述】:

这是我学习 C 编程的第一个学期,我试图将用户输入限制为 22 位有符号整数,并且如果命令由于某种原因不起作用 我尝试用 else 更改第二个 if 语句,但没有做任何事情

   #include <stdio.h>
#include <stdlib.h>
void main ( int argc, char *argv[] )
{
    
    int first;
    int second;
    char menu_choice;
    if(first>=2097150|| first<=-2097150|| second<=-2097150||second>=2097150)
        {
            printf("please choose a number between -2097150 and 2097150");
            return(0);
        }
        if(first<=2097150|| first>=-2097150|| second>=-2097150||second<=2097150)
        {//rest of the code goes here but that is not part of the problem
}

【问题讨论】:

  • first 在您测试它的时候是不确定的。没有输入。
  • 我没有简单的解决方案来限制输入为 22 位,但是你可以限制读取的位数:scanf("%6d", &amp;n);
  • @Amadan first 和 second 在运行 ./a.exe(23,34 或其他)时输入
  • 如果您键入./a.exe 23 34,它们将在argv 中作为字符串提供; firstsecond 对此一无所知。您需要转换它们,并将值分配给firstsecond;这应该可以解决问题:first = atoi(argv[1]); second = atoi(argv[2]);
  • 最简单的方法是将int first; int second;更改为int first = atoi(argv[1]); int second = atoi(argv[2]);,然后 first 和 second 将具有值。

标签: c


【解决方案1】:

如果您要接受任何输入,它总是以相同的方式工作。您的工作是要求用户提供有效输入并处理输入无效的所有情况。您有两个选择:(1)使用fgets() 一次读取每一行输入,然后从填充有sscanf()(或strtol())的缓冲区中提取值,或者(2)使用@ 读取输入值987654325@ 在每次输入后直接手动清空stdin 以删除任何无关字符。两者最终在他们所做的事情上是相同的。

无论是使用fgets()还是scanf()读取输入,都必须检查用户是否通过按Ctrl + d(或Ctrl + z kbd> 在 Windows 上)。

如果您使用 scanf()sscanf(),则必须验证 (1) 提供了一个有效的整数值,并且 (2) 它在 22 位有符号值的范围内。

您要求用户输入您需要的输入的方式是您不断循环,直到用户提供有效输入。在输入满足您的所有条件后,您才退出输入循环。

总而言之,你可以做类似的事情:

#include <stdio.h>

#define MAXSIGNED22  0x1FFFFF       /* if you need a constant, #define one (or more) */
#define MINSIGNED22  -(MAXSIGNED22) - 1

int main (void) {
    
    int value = 0;          /* value to hold input */
    
    for (;;) {              /* loop continually until good input or manual EOF */
        int rtn;            /* return for scanf() */
        fputs ("enter a 22-but signed number: ", stdout);       /* prompt for input */
        rtn = scanf ("%d", &value);                 /* read with scanf(), save return */
        
        if (rtn == EOF) {   /* check for manual EOF */
            puts ("(user canceled input)\n");
            return 0;
        }
        /* empty any extraneous characters from stdin */
        for (int c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
        
        /* check matching failure */
        if (rtn == 0)
            fputs ("  error: invalid integer value.\n", stderr);
        /* validate in range of 22-bit */
        else if (value < MINSIGNED22 || MAXSIGNED22 < value)
            fputs ("  error: value out of range for 22-bit.\n", stderr);
        /* good 22-bit value, break loop */
        else
            break;
    }
    
    printf ("\nvalid 22-bit signed number: %d\n", value);
}

假设负数的 twos-compliment 表示,带符号的 22 位数字的有效范围是 -2097152 -> 2097151。见min and max value of data type in C

使用/输出示例

$ ./bin/22bit
enter a 22-but signed number: 12345678
  error: value out of range for 22-bit.
enter a 22-but signed number: -12345678 (and other junk)
  error: value out of range for 22-bit.
enter a 22-but signed number: bananas!
  error: invalid integer value.
enter a 22-but signed number: 2097152
  error: value out of range for 22-bit.
enter a 22-but signed number: 2097151

valid 22-bit signed number: 2097151

$ ./bin/22bit
enter a 22-but signed number: -2097153
  error: value out of range for 22-bit.
enter a 22-but signed number: -2097152

valid 22-bit signed number: -2097152

查看一下,如果您有任何问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多