[英]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.