此问题之前已被问过,但我从来没有找到一个清晰简单的答案,所以我再问一遍......
我想知道,如果不使用除stdio.h之外的任何其他库,如何检查用户输入的是否是数字值。基本上,要求用户输入介于0和9之间的值。如果数字介于这两者之间,则会继续。例如,如果数字为12,则它会循环回到问题并再次询问该数字。
它工作正常,但如果我输入一个字母或十进制数字,它会进入无限循环......
基本上这是我的问题:如何检查输入的值是不是字符和非小数?
这是代码的开头:(对不起,它用法语,但你明白了......)
int main()
{
int nb1, nb2, rand_1, rand_2;
int nb_coups = 0;
int points = 0;
printf("\n\n ------ BIENVENUE A LA GRANDE ROUE ! ------\n\n");
do{
//Saisie 1er nombre
printf("Entrez le premier nombre choisi (entre 0 et 9) : ");
scanf("%d",&nb1);
//Tant que le 1er nombre n'est pas compri entre 0 et 9, on le redemande
while(nb1<0 || nb1>9)
{
printf("Nombre incorrect. Entrez le premier nombre choisi (entre 0 et 9) : ");
scanf("%d",&nb1);
}
//On affiche le 1er nombre
printf("Le nombre choisi est : %d\n\n",nb1);
答案 0 :(得分:3)
不要将scanf()用于控制台输入。相反,使用fgets()将stdin中的数据读入字符串然后解析,或者使用getchar()一次读取一个字符。如果你的环境包含这样的东西,你也可以考虑getch(),当支持它时,通常会读取一个打字字符而不等待之后的返回。
答案 1 :(得分:2)
使用fgets和sscanf:
char line [16];
fprintf(stderr, "Entrez le premier nombre choisi (entre 0 et 9) : ");
fgets (line, sizeof(line), stdin);
ret = sscanf(line,"%d",&nb1);
//Tant que le 1er nombre n'est pas compri entre 0 et 9, on le redemande
while((ret == 0) || (nb1 < 0) || (nb1 > 9)) {
fprintf(stderr, "Nombre incorrect. Entrez le premier nombre choisi (entre 0 et 9) : ");
fgets (line, sizeof(line), stdin);
ret = sscanf(line,"%d",&nb1);
}
答案 2 :(得分:1)
您应该检查返回值以清除非数字。
printf("Entrez le premier nombre choisi (entre 0 et 9) : ");
ret = scanf("%d",&nb1);
//Tant que le 1er nombre n'est pas compri entre 0 et 9, on le redemande
while(!ret && (nb1<0 || nb1>9))
{
char ch;
while ((ch = getchar()) != '\n' && ch != EOF); // Flush the buffer
printf("Nombre incorrect. Entrez le premier nombre choisi (entre 0 et 9) : ");
ret = scanf("%d",&nb1);
}
答案 3 :(得分:0)
不要使用scanf,自己进行解析。
char c;
int nb1 = 0;
while(1) {
c = getchar();
if(c > '0' && c < '9') {
nb1 = nb1*10 + (c - '0'); // if you want numbers bigger than 9
}
else {
break; // matches '\n', invalid chars and EOF
}
}
瞧!
答案 4 :(得分:0)
我喜欢一般用途:
通用,具有一些溢出保护,并且如果您喜欢不同的范围,则允许一些通用性。
#include <ctype.h>
int atoi(char *s, int N)
{
int n; /* value being accumulated */
int sign; /* =1 if result is positive, -1 if negative */
while((N>0)&&(*s == '\t' || *s == ' '))
{
N--;
s++; /* skip white space */
}
sign=1; /* assume a positive value */
if(*s == '+' || *s == '-')
{
N--;
sign = *s++ == '-' ? -1 : 1; /* adjust result sign */
}
for(n=0; (N>0)&&isdigit(*s); s++,N--)
n = n * 10 + *s - '0';
return (sign * n); /* result adjusted for sign */
}