2010-05-09 102 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(继续循环)

相关问题