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

时间:2010-05-09 00:02:53

标签: c scanf

我有一个简单的问题;

以下是代码:

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

只要我输入数字,添加'int'就会保持循环,我尝试了'char'但是没有用。确实有字母表的东西吗? :S 请回复!

感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

你无法阻止用户输入任何他想要的内容 - 你只能忽略他/她输入的任何你不喜欢的东西。

典型的模式是使用fgets读取字符串,然后扫描字符串并检查所有输入是否为isdigit的数字。如果是全部数字,则转换为整数;否则,扔掉它再次获得输入。

或者,使用strtol进行转换。它设置一个指向它可以转换为数字的数据末尾的指针;在这种情况下,你(显然)希望它指向字符串的结尾。

如果您不介意某些不可移植的代码,您可以一次读取一个字符,并丢弃除数字之外的任何内容(例如,在Windows上使用getch)。

答案 1 :(得分: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

答案 2 :(得分: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;
  }

答案 3 :(得分:0)

就个人而言,我会将输入读入缓冲区并扫描该字符串以查找我的号码。

  

char buffer [100];
  浮动值;
  做(
  scanf(“%s”,缓冲区);
  } while(sscanf(buffer,“%f”,&amp; value)!= 1)

这将循环,直到用户在该行上输入的第一件事是数字。输入可以是任何东西,但只有当输入的第一个东西是数字时才会超过此块 示例输入:
43289(价值是43289)
43.33(价值是43.44)
392gifah(价值是392)
ajfgds432(继续循环)