2010-05-09 80 views
4

我有一個簡單的問題;如何防止用戶輸入字母或數字?

下面是代碼:

#include<stdio.h> 
main(){ 
int input; 
printf("Choose a numeric value"); 
scanf("%d",&input); 
} 

我希望用戶只輸入數字... 所以它必須是這樣的:

#include<stdio.h> 
main(){ 
int input; 
printf("Choose a numeric value"); 
do{ 
    scanf("%d",&input); 
}while(input!= 'something'); 
} 

我的問題是,我不知道什麼東西要替換...我怎樣才能防止用戶輸入字母字符?

編輯

我剛剛得到一些有趣的事情:

#include<stdio.h> 
main(){ 
int input; 
printf("Choose a numeric value"); 
do{ 
    scanf("%d",&input); 
}while(input!= 'int'); 
} 

添加「詮釋」將繼續只要我輸入數字的循環,我想「炭」,但沒有工作..肯定有什麼字母是正確的? :S 請回復!

感謝您的幫助!

+0

刪除標籤的極限選擇到'和'數字',我認爲在'限制選擇'方面沒有任何一種開發專家。 – 2010-05-09 00:06:21

+0

可能重複[如何防止用戶輸入不正確的輸入?](http://stackoverflow.com/questions/2795252/how-to-prevent-users-from-typing-incorrect-inputs) – 2010-05-09 04:32:08

回答

4

strtol庫函數將數字的字符串表示轉換爲其對應的整數值,並且還將設置一個指向第一個字符與有效數字不匹配。

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
... 
int value; 
char buffer[SOME_SIZE]; 
char *chk; 
do 
{ 
    printf("Enter a number: "); 
    fflush(stdout); 
    if (fgets(buffer, sizeof buffer, stdin) != NULL) 
    { 
    value = (int) strtol(buffer, &chk, 10); /* assume decimal format */ 
    } 
} while (!isspace(*chk) && *chk != 0); 

如果chk點比空格或一個字符串終止(0),則該串不是有效的整數常數以外的內容。對於浮點輸入,請使用strtod

+0

非常感謝您花時間和回答。 那裏使用的很先進的命令,關於他們瞭解更多的虐待研究:) – NLed 2010-05-09 01:18:15

4

你無法阻止用戶輸入任何他想要的東西 - 你只能忽略他/她輸入的任何你不喜歡的東西。

一個典型的模式是讀取fgets的字符串,然後掃描字符串並檢查所有輸入是否爲isdigit。如果它是全部數字,則轉換爲整數;否則,扔掉它並再次獲得輸入。

或者,使用strtol來進行轉換。它設置一個指向它可以轉換爲數字的數據結尾的指針;在這種情況下,你(顯然)希望它指向字符串的末尾。

如果您不介意一些不可移植的代碼,則可以一次讀取一個字符,並丟棄除數字以外的任何內容(例如,在Windows上使用getch)。

+0

我同意你的發言。但是,我如何在我的代碼中實現該代碼?我也使用do-while循環嗎?對不起,我不是C中的專家:( – NLed 2010-05-09 00:17:11

+0

是的,它通常是一個do-while循環。do {read(data);} while(!all_digits(data)); int value = convert(data);'。 – 2010-05-09 00:36:46

+0

回覆這些命令對我來說有點太高級xD這可能是你告訴我的簡單方法,但我不知道它們是如何工作的 謝謝無論如何,我試圖通過操縱ACSII變量..不知道這是否會工作? – NLed 2010-05-09 00:47:35

0

你不應該使用scanf在數字閱讀 - 看http://www.gidnetwork.com/b-63.html

使用fgets代替。

但是,如果必須使用scanf,你可以這樣做:

#include <stdio.h> 
    int main() { 
     char text[20]; 
     fputs("enter some number: ", stdout); 
     fflush(stdout); 
     if (fgets(text, sizeof text, stdin)) { 
      int number; 
      if (sscanf(text, "%d", &number) == 1) { 
       printf("number = %d\n", number); 
      } 
     } 
     return 0; 
    } 
+0

感謝您提供的信息。 如何使用某種ACSII操作來防止字母字符? – NLed 2010-05-09 00:25:08

0

就個人而言,我會將輸入讀入緩衝區並掃描該字符串以查找我的號碼。

char buffer [100];
浮點值;
do {
scanf(「%s」,buffer);
}而(sscanf的(緩衝器, 「%F」,&值)!= 1)

這將循環直到用戶上線進入第一件事情是一個數字。輸入可以是任何東西,但只有當輸入的第一件事是一個數字時纔會通過該塊。
例如輸入:
43289(值43289)
43.33(值43.44)
392gifah(值是392)
ajfgds432(繼續循環)

相關問題