【问题标题】:How to restrict the user to only input whole number and refuse any other characters in scanf?如何限制用户只输入整数并拒绝scanf中的任何其他字符?
【发布时间】:2011-11-19 14:00:17
【问题描述】:

我正在尝试获取用户输入并允许他们只输入一个整数,这也是正数。

我正在努力解决这个问题

printf("Enter the first and second number in whole number: ");
scanf("%d,%d", &first, &second);

if (input != '\n') //notice this line I'm trying to check if is a character//
    printf("Error! CHARACTER NOT ACCEPTED!!\n");

else if (First <= 0)
    printf("Error! First must be a positive value!\n");

else if (Second <= 0)
    printf("Error Second must be a positive value!\n");

上面的代码将检查两件事。一,如果用户输入了我想要的字符。其次,如果数字是正数。

我如何实现这些检查?

【问题讨论】:

    标签: c input scanf


    【解决方案1】:

    读取整行(使用getline),然后将其转换为数字,可能使用strtol(并测试结束指针)。

    或者对scanf 使用%n 格式,并测试scanf 返回的(成功转换次数)

    【讨论】:

    • 好吧,我从来没有研究过strtol,但如果是这样,这是否意味着我永远无法以任何其他方式完成这项任务?
    • 为什么不阅读更多关于 linux.die.net/man/3/strtol 的信息或自己阅读相应内容?
    【解决方案2】:

    不要使用scanf!只需读取输入,然后使用第二个参数调用 strtoul 并检查第二个参数中返回的值是否为 '\0'。

    【讨论】:

    • 我从来没有研究过strtol,但如果是这样,这是否意味着不可能成功完成这项任务?
    • 你可以试试scanf("%u%1s", &d, s),但是如果用户输入"34\n",那么scanf就会挂起。在写 C 的许多年里,我只在大学的练习中使用过 scanf。它没有目的。任何适用 scanf 的问题都是应该用不同的语言解决的问题。
    • 好吧,我想现在我的问题是我不允许使用我从未学习过的东西,因为这是一项作业,如果我使用其他东西,我想我的教授会扣掉我的分数问题是他希望我们从用户那里获得输入,同时如果用户输入任何字符然后返回消息并将它们循环回再次输入......我已经成功使用负数但没有成功字符 :(
    • @Ali:这很不幸,因为scanf 确实没有什么好的方法可以做到这一点。如果您想拒绝像 3.412b 这样的错误输入,或者其他任何以数字开头但不是有效整数的输入,您将 必须 将输入读取为文本,然后使用strtol 或自己检查和转换每个字符。
    【解决方案3】:

    将输入读取为文本,然后使用strtol 转换为整数:

    int val;
    char inbuf[SIZE]; // where SIZE is long enough to handle expected inputs
    ...
    if (fread(inbuf, sizeof inbuf, stdin) != NULL)
    {
      char *chk;
      val = (int) strtol(inbuf, &chk, 10);
      if (!isspace(*chk) && *chk != 0)
        printf("%s is not a valid integer value\n", inbuf);
    }
    

    strtol 将读取inbuf 中的字符串并将其转换为等效的整数值。 chk 将指向inbuf 中未转换的第一个字符。如果该字符不是空格或 0,则该字符串不是有效的整数。

    【讨论】:

      【解决方案4】:

      您不能限制用户输入的字符。您应该阅读用户给您的任何内容并决定如何处理。

      如果要使用scanf,可以这样:

      int ret = scanf("%d", &num);
      

      scanf 的返回值显示了它成功读取的%s 的数量。例如:

      12      <-- this input returns 1, num will be 12
      asd     <-- this input returns 0, num will be untouched
      123xf   <-- this input returns 1, num will be 123
      

      在最后一个示例中,xf 将保留在输入中,而进一步的 scanfs 将读取它。

      所以对于第一个if,您只需检查scanf 的返回值是否为1。如果不是,那么您无法从输入中读取数字。

      对于第二个if,检查是否num &lt;= 0

      【讨论】:

        【解决方案5】:

        我想你需要这样的东西:

        #include <stdio.h>
        #include <stdlib.h>
        
        int main ()
        {
          int i;
          char szInput [256];
        
           printf ("Enter a number: ");
           fgets ( szInput, 256, stdin );
           i = atoi (szInput);
           if(i<0)
           printf("Error! Input must be a positive value!");
        
        
           else{
        
                //Do the rest
        
               }
           return 0;
        }
        

        请注意,atoi() 需要十进制的字符串表示形式,如果它接收到一个字符,它会返回一个 0,所以你不需要再处理字符了!

        编辑:

        通过一些研究,我发现使用 Strtol() 比使用 atoi() 更好。请参阅此说明:Why not to use atoi()

        【讨论】:

        • 是什么让你觉得不是??
        • 嗯,问题是我还是 C 语言的新手,从来没有研究过 stdlib.h,而且我还处于 C 基础的初级阶段。
        • 好吧,我们都是来学习的,我的情况也差不多! :) 看到我发现了一个新东西并在ans中更新。
        • 确实如此,但我担心我的教授会因为使用他从未教过我们的新东西而扣分。但无论如何,谢谢,我现在要调查一下。
        • 好吧,告诉你的教授它来自 SO 并请他来 SO ,这样他也可以学习新事物 :D ,开玩笑的!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-25
        • 2014-04-25
        相关资源
        最近更新 更多