iT邦幫忙

0

使用者輸入時有辦法檢查輸入的數字是否溢位嗎?

  • 分享至 

  • xImage

如題,想請問有辦法達成這件事嗎?
上網找只有找到防止加減乘除發生溢位,但沒有看到有關防止輸入溢位的文章
以下是簡短的程式碼

#include <stdio.h>
#include <stdint.h>
int main()
{
uint32_t number = 0;
printf("Please enter a number:");
scanf("%d",&number);
...
return 0;
}

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
wiseguy
iT邦超人 1 級 ‧ 2022-10-14 00:47:21
最佳解答

你不覺得,你玩的game, 應用程式之類的,不會讓你想輸入什麼就輸入什麼嗎?
這些「嚴謹」的程式,不會使用 scanf() 來讀 user 的資料的。了解嗎?
因為 scanf() 在讀入 user 資料的那當下,你程式是無法做到:

  1. 避免 user 輸入無關的字元,比如你要讀數字,但 user 可以輸入 abc
  2. user 不能做「行編輯」,比如原本想輸入 123,先輸入了 23 卻不能按[home]跳到前面去補上 1
  3. 不能按 [esc] 跳過輸入,或其他你自行定義的按鍵,比如user可以按[F10]重新輸入
    所以呢,這種功能以我之前的經驗,是用 getch() 在迴圈中,持續捕捉 user 的輸入,如果是按了 0~9,就放到字元陣列中,並 putchar() 到畫面上。這效果跟 scanf() 很像。但是若 getch() 是得到 user 按了不是 0~9 的字元,最簡單就是 continue; 這樣 user 會發現按 abc 完全沒反應。於是你可以在user每按一次 0~9 時,轉換陣列中的字串為數字,檢查看看是否已經溢位。
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/* reads from keypress, doesn't echo */
int getch(void)
{ 
    struct termios oldattr, newattr;
    int ch;
    tcgetattr(STDIN_FILENO, &oldattr); 
    newattr = oldattr; 
    newattr.c_lflag &= ~(ICANON | ECHO); 
    tcsetattr(STDIN_FILENO, TCSANOW, &newattr); 
    ch = getchar(); 
    tcsetattr(STDIN_FILENO, TCSANOW, &oldattr); 
    return ch; 
} 

void main(){
    int x;
    char s[20]={0}, c;
    int i=0;
    printf("Please enter a number:");
    while(1){ // 這個迴圈就是用來取代 scanf()
       c = getch();
       if (c >= '0' && c <= '9'){ // 如果按的是 0~9
           s[i++]=c;
           putchar(c);
       } else if (c == '\n'){ // 如果按的是 [Enter]
           printf("\n\n");
           break;
       }
       x = atoi(s); // 每按一次就檢查一次有沒有超過你設定的最大值。例如99999
       if (x > 99999){
          printf("\nOverflow!\n"); // 超過就顯示溢位
          break; // 我這邊範例是直接中止,但你可以再繼續偵測是否用倒退來刪除或其他鍵做特別處理
       }
    }
    printf("Finish.\n");
}

謝謝您詳細的解釋,我已經都搞懂了

我要發表回答

立即登入回答