簡體   English   中英

如何限制用戶輸入

[英]How to limit a user input

這是我學習 C 編程的第一個學期,我試圖將用戶輸入限制為 22 位簽名的 integer 並且 if 命令由於某種原因不起作用我嘗試用 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
}

如果您要接受任何輸入,它總是以相同的方式工作。 您的工作是要求用戶提供有效輸入並處理輸入無效的所有情況。 您有兩種選擇:(1) 使用fgets()一次讀取每一行輸入,然后從填充有sscanf() (或strtol() )的緩沖區中提取值,或者 (2) 使用scanf()讀取輸入值scanf()在每次輸入后直接手動清空stdin以刪除任何無關字符。 兩者最終在他們所做的事情上是等價的。

無論是使用fgets()還是scanf()讀取輸入,您都必須檢查用戶是否通過按Ctrl + d (或 Windows 上的Ctrl + z )生成了手動EOF

如果使用scanf()sscanf() ,則必須驗證 (1) 提供了有效的 integer 值,並且 (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);
}

假設負數的二進制補碼表示,帶符號的 22 位數的有效范圍是-2097152 -> 2097151 查看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

看看事情,如果你有任何問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM