scanf问题:输入整数后接字符,例如:1p,因为单个输入被视为2个输入

scanf问题:输入整数后接字符,例如:1p,因为单个输入被视为2个输入,c,scanf,C,Scanf,注意:为了避免误解,该代码旨在处理输入错误。。我要求输入整数(无字符),但用户可能会错误地输入字符,因此如何避免以下情况: 我知道scanf很烂,但我不得不使用它,因为某些原因。 所以,我现在面临的问题是,如果我扫描用户的单个整数,如下所示: scanf("%d",&c); if (scanf("%d",&confirm)!=1) { flushInput(); confirm=0; } 如果用户输入后跟字符

注意:为了避免误解,该代码旨在处理输入错误。。我要求输入整数(无字符),但用户可能会错误地输入字符,因此如何避免以下情况:

我知道scanf很烂,但我不得不使用它,因为某些原因。 所以,我现在面临的问题是,如果我扫描用户的单个整数,如下所示:

  scanf("%d",&c);
 if (scanf("%d",&confirm)!=1)
  {
       flushInput(); confirm=0;
  }
如果用户输入后跟字符的数字,例如:1k,则将其视为双输入,而不是单输入,并且检查scanf的返回值和使用flushinput概念在这里不起作用。 让我的问题更清楚:

系统会提示用户输入选项,如果选项无效,系统会再次(通过循环)询问用户,因此,如果用户输入ex:

k,给出一次消息(这是无效输入),然后重新扫描

k2,给出一次消息(这是无效输入),然后重新扫描

2k,给出消息(这是无效输入)两次,然后重新扫描

有解决这个问题的提示吗? 提前谢谢

注意:我检查scanf的返回值如下:

  scanf("%d",&c);
 if (scanf("%d",&confirm)!=1)
  {
       flushInput(); confirm=0;
  }
其中:

   void flushInput()///prevents infinite loops resulted due to character input instead of integer
   {
    int c; //c ->absorbs the infinite characters resulted due to the entry of chars, using getchar()
    while((c = getchar()) != EOF && c != '\n');
  }

以下内容针对OP给定的使用
scanf
的约束条件解决了这个问题。然而,首选的选择是读取整行,然后使用更安全的函数解析字符串,比如执行适当的范围检查的函数。更多关于这方面的信息,请访问

使用
scanf
,下面的示例代码每行输入读取一个整数,同时拒绝包含除整数本身以外的任何非空白的行

#include <stdio.h>
#include <string.h>

int scanf_solo_int(int *p)
{
    // read integer
    int ret = scanf("%d", p);
    if(ret == EOF) return -1;

    // read rest of line
    char s[132 + 1];
    if(scanf("%132[^\n]", s) != 1) s[0] = '\0';
    scanf("%*1[\n]");

    if(ret == 1)
    {
        // check for extra non-whitespace
        if(s[strspn(s, " \t\n")] != '\0') ret = 2;
    }

    return ret;
}

int main()
{
    for(;;)
    {
        int n;
        switch(scanf_solo_int(&n))
        {
        case 1:  printf("ok: %d\n", n); continue;

        case 0:  printf("error: not a number\n"); continue;
        case 2:  printf("error: extra characters past %d\n", n); continue;

        case -1: printf("error: EOF\n"); break;
        default: printf("error: unexpected\n"); break;
        }
        break;
    }
    return 0;
}

最后一行是未捕获整数溢出的示例,其中
scanf
接受
9876543210
字符串作为
%d
输入,但在没有警告的情况下将其
mod 2^32
截断为
1286608618

。然而,首选的选择是读取整行,然后使用更安全的函数解析字符串,比如执行适当的范围检查的函数。更多关于这方面的信息,请访问

使用
scanf
,下面的示例代码每行输入读取一个整数,同时拒绝包含除整数本身以外的任何非空白的行

#include <stdio.h>
#include <string.h>

int scanf_solo_int(int *p)
{
    // read integer
    int ret = scanf("%d", p);
    if(ret == EOF) return -1;

    // read rest of line
    char s[132 + 1];
    if(scanf("%132[^\n]", s) != 1) s[0] = '\0';
    scanf("%*1[\n]");

    if(ret == 1)
    {
        // check for extra non-whitespace
        if(s[strspn(s, " \t\n")] != '\0') ret = 2;
    }

    return ret;
}

int main()
{
    for(;;)
    {
        int n;
        switch(scanf_solo_int(&n))
        {
        case 1:  printf("ok: %d\n", n); continue;

        case 0:  printf("error: not a number\n"); continue;
        case 2:  printf("error: extra characters past %d\n", n); continue;

        case -1: printf("error: EOF\n"); break;
        default: printf("error: unexpected\n"); break;
        }
        break;
    }
    return 0;
}

最后一行是未捕获整数溢出的示例,其中
scanf
接受
9876543210
字符串作为
%d
输入,但在没有警告的情况下将其
mod 2^32
截断为
1286608618

%d
用于读取数字(int)为什么你要输入字符?如果你说“出于某种原因必须使用scanf”,我想知道这到底意味着什么?您编写的代码是学校学习练习的一部分,还是某个公司的生产代码?事实上,
scanf
几乎毫无用处,事实上,它对于健壮的错误检查完全没有用处,对于任何类型的商业或生产代码中的用户输入也完全没有用处。如果你想进行健壮的、错误检查的输入,你要么根本无法使用
scanf
,或者,如果您使用了正确的非scanf方法,则需要花费您五倍的时间(最多完成90%的错误检查)。很抱歉这么说,因为它没有回答这个问题,我知道您说过需要使用
scanf
,但这并不是一个合理的要求。如果你告诉我我必须做稳健的输入,我必须使用
scanf
,我要么(a)辞职,要么(b)使用
%[^\n]
阅读整行内容,然后理智地解析它们(也就是说,如果我被允许调用
fgets
),如果这是你正在学习的课程的一部分,并且你的导师坚持要求你(a)使用(b)
scanf
实现健壮的错误检查,这是一个毫无意义的练习,从中你将学到任何有用的东西,也许除了忍耐。是的,在现实世界中,程序执行健壮的、检查错误的输入是很重要的,但是在现实世界中,没有人使用
scanf
%d
是用于读取数字(INT)的。为什么要给
char
类型输入更好的答案?当你说你需要时,提供最小的可重复程序“出于某种原因,我们必须使用scanf“,我想知道这到底意味着什么?您编写的代码是学校学习练习的一部分,还是某个公司的生产代码?事实上,
scanf
几乎毫无用处,事实上,它对于健壮的错误检查完全没有用处,对于任何类型的商业或生产代码中的用户输入也完全没有用处。如果你想进行健壮的、错误检查的输入,你要么根本无法使用
scanf
,或者,如果您使用了正确的非
scanf方法,则需要花费您五倍的时间(最多完成90%的错误检查)。很抱歉这么说,因为它没有回答这个问题,我知道您说过需要使用
scanf
,但这并不是一个合理的要求。如果你告诉我我必须做稳健的输入,我必须使用
scanf
,我要么(a)辞职,要么(b)使用
%[^\n]
阅读整行内容,然后理智地解析它们(也就是说,如果我被允许调用
fgets
),如果这是你正在学习的课程的一部分,并且你的导师坚持要求你(a)使用(b)
scanf
实现健壮的错误检查,这是一个毫无意义的练习,从中你将学到任何有用的东西,也许除了忍耐。是的,在现实世界中,程序执行健壮的错误检查输入非常重要,但在现实世界中,没有人使用
scanf
实现这一点。