如何防止用户输入字母或数字?

4

I have a simple problem;

Here is the code :

#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');
}

我的问题是我不知道在“something”中要替换什么……如何防止用户输入字母字符?
编辑
我刚刚得到了一些有趣的东西:
#include<stdio.h>
main(){
 int input;
 printf("Choose a numeric value");
 do{
   scanf("%d",&input);
 }while(input!= 'int');
}

添加“int”将使循环保持运行,只要我输入数字。我尝试过“char”,但那没用...肯定有适用于字母的东西吧?:S 请回复! 谢谢你的帮助!

移除'tags'中的'limit-choices-to'和'numbers',我认为没有任何一种开发人员是'限制选择'的专家。 - user216441
可能是重复的问题:如何防止用户输入错误的内容? - Jonathan Leffler
4个回答

4
< p > 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

非常感谢您抽出时间回答问题。 使用了相当高级的命令,我会进行研究以更好地理解 :) - NLed

4
您无法阻止用户输入任何他想要的内容 - 您只能忽略您不“喜欢”的任何输入。
一个典型的模式是使用fgets读取字符串,然后通过isdigit扫描字符串并检查所有输入是否为数字。如果都是数字,则将其转换为整数;否则,将其丢弃并重新获取输入。
或者,使用strtol进行转换。它会将指针设置为可以转换为数字的数据的末尾;在本例中,您(显然)希望它指向字符串的末尾。
如果您不介意一些非可移植代码,可以逐个字符地读取,并且除了数字之外的任何内容都将被丢弃(例如,在Windows上使用getch)。

我同意你的说法。但是我该如何在我的代码中实现呢?我也需要使用do-while循环吗?抱歉,我不是C语言方面的专家:( - NLed
是的,通常使用 do-while 循环。do { read(data); } while (!all_digits(data)); int value = convert(data); - Jerry Coffin
谢谢回复。这些命令对我来说有点太高级了 xD 这可能是你告诉我的一种简单方法,但我不知道它们是如何工作的。 无论如何,还是谢谢你,我正在尝试通过操作ACSII变量找到一种方法..不知道那会不会有效? - NLed
1
“你不能阻止用户输入任何他想要的内容…” - 当然可以…通过适当修改键盘 :-) - Stephen C

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;
  }

感谢您提供的信息丰富的回复。 使用某种ACSII操作来防止字母字符怎么样? - NLed

0

个人而言,我会将输入读入缓冲区,并扫描该字符串以获取我的数字。

char buffer[100];
float value;
do {
scanf("%s", buffer);
} while ( sscanf(buffer,"%f", &value) != 1 )

这将循环,直到用户在行上输入的第一件事是数字。输入可以是任何内容,但只有在输入的第一件事是数字时才能通过此块。
例如输入:
43289(值为43289)
43.33(值为43.44)
392gifah(值为392)
ajfgds432(继续循环)




网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接