如何防止非数字或非字符输入或符号并在C中获得所需的输出

时间:2016-01-06 04:37:39

标签: c

这是我从youtube教程修改的源代码。该计划的目的是:

它问你的年龄。如果你输入18或者更多,它会询问你的性别而不是打印,你可以输入dude或m'lady(取决于你的性别)。如果你把你的年龄小于18岁,则打印出“没什么可看的!”

我想确保如果输入不是我要求的(仅限数字或仅字符),则显示“输入无效”。在我的程序中,程序要求年龄的第一部分,当年龄输入是字母或符号时,它显示无效输入。但每当我将字母表与18a或18 /等数字结合起来时,就表明:

“请输入您的性别。(m / f)” “输入无效。”

另外,如果我输入18或更多,并转到程序询问有关性别(m / f)的部分,如果我输入数字或符号,则显示无效输入..但是当我像m1或m / m组合时显示:

“你可以进入这个网站。”

任何人都可以帮我解决如何解决这个问题?

#include <stdio.h>

#include <conio.h>

int main(void)  {

   char gender; 
   int age=0;

   printf("Please enter your age. \n");

   if(scanf(" %d",&age)!=1)  {
      printf("invalid input. \n");
      return 0;
   }

   if(age>=18)  {

      printf("Please enter your gender.(m/f) \n");

      if(scanf(" %s", &gender) !=1)  {
         printf("Invalid input.\n");

         return 0;
      }

      else if(gender== 'm')  {
         printf("You may enter this website dude.\n");
      }

      else if(gender== 'f')  {
         printf("You may enter this website m'lady.\n");
      }

      else  {
         printf("Invalid input. \n");
         return 0;
      }
   }

   else if(age<18)  {
      printf("Nothing to see here! \n\n");
      return 0;
   }

      return 0;
}

2 个答案:

答案 0 :(得分:2)

如果您想避免这种行为,您应该阅读每个用户选项的整行,并完全验证它。

要阅读整行,您可以使用scanf(" %[^\n]",str)(*),而不是使用%d%s。然后,您可以验证用户输入,以检查它是否正是您想要的。

<强>附加: 要验证年龄,您可以使用strtol解释here,并验证性别我认为简单的字符串比较就可以了。

(*)有几个选项可用于读取C中的整行(例如fgets),并且还有理由不使用scanf(" %[^\n]",str)(可能的缓冲区溢出)但我试图向您展示解决方案使用您正在使用的功能,有关此主题的讨论,请查看this post

答案 1 :(得分:0)

在您使用stdin读取输入后,您正在处理的问题与保留在输入缓冲区scanf)中的字符有关。当您阅读age时,转换会将stdin的数字读取到组成的字节数和intint后面的任何其他字符都会保留在输入缓冲区中。 (例如18ascanf读取18a在以下内容后留在输入缓冲区中:)。

int c, age;

if (scanf (" %d", &age) != 1) {
    printf ("invalid age input - conversion failed.\n");
    return 1;
}

注意>您也可以使用strtol执行相同的额外字符检查,以便在转接后检查endptr

然后,您的输入缓冲区中的'a'将被性别测试作为输入。 (因为它已经在输入缓冲区中,在{em>性别的提示后由scanf自动读取)要检查是否已经消耗了所有输入,您只需检查字符是否是保留在输入缓冲区中的是'\n'(用户按 Enter 的结果)。如果输入缓冲区中的下一个字符不是'\n',则在age后面输入其他字符。

if ((c = getchar()) != '\n') {
    printf ("invalid input - additional characters.\n");
    return 1;
}

然后,您可以在检查剩余字符后强加您的年龄限制:

if (age < 18)  {
    printf ("Nothing to see here!\n\n");
    return 1;
}

age测试的简短示例可能是:

#include <stdio.h>

int main (void) {

    int c, age;

    if (scanf (" %d", &age) != 1) {
        printf ("invalid age input - conversion failed.\n");
        return 1;
    }
    if ((c = getchar()) != '\n') {
        printf ("invalid input - additional characters.\n");
        return 1;
    }

    if (age < 18)  {
        printf ("Nothing to see here!\n\n");
        return 1;
    }

    printf ("\n age: %d\n\n", age);

    return 0;
}

<强>实施例

$ ./bin/age
18

 age: 18

$ ./bin/age
17
Nothing to see here!

$ ./bin/age
18a
invalid input - additional characters.

$ ./bin/age
aa
invalid age input - conversion failed.

仔细看看,如果您有任何问题,请告诉我。