使用scanf的检查输入参数(using scanf to check input paramete

2019-10-20 05:05发布

尝试使用scanf函数来检查我有投入适量(在这种情况下2),代码工作正常,但如果我把在1个输入它只是让等待一秒钟,如果我把3个只是丢弃第三,什么我做永远不会返回错误信息。 搜索的答案,但没有发现任何东西我可以使用,请问原因是我使用了这个问题的教科书了代码,因为我有在这里(我复制出一个不同的例子为int_swap字完全相同的一句话,它似乎并没有工作要么?任何想法?很抱歉,如果这是一个愚蠢的或简单的问题。

#include <stdlib.h>
#include <stdio.h>



void int_sort2(int*, int*);


int
main(int argc, char* argv[])
{
        int x, y;
        printf("Please enter 2 numbers : ");
        if(scanf("%d%d", &x, &y) != 2)
    { 
            printf("Error in numbers entered\n");
        exit(EXIT_FAILURE);
    }
printf("The original order was %d,   %d\n", x, y);
int_sort2(&x, &y);
printf("The sorted order is : %d,    %d\n", x,y);


return 0;
}


void
int_sort2(int *x, int *y)
{
if(*y < *x)
    {
        int temp;
        temp = *x;
        *x = *y;
        *y = temp;

    }

    return;
}

Answer 1:

由于文档scanf表示,

On success, the function returns the number of items of the argument list successfully filled.

它会返回已加载的不是你刚刚输入的项目数项目的数量。

解:

算上整数的数量,您SCANF之前。



Answer 2:

如果我把在1个输入它只是让等待第二

在这一点上,如果输入流结束(如从管道数据的结束或者按平台特定键终止控制台输入),你会得到错误信息。

比方说,你建叫做可执行mytest从上面的代码。 如果你使用:

echo 20 | ./mytest

你应该得到的错误消息。

如果我把3只是丢弃第三,什么我做永远不会返回错误信息。

scanf线查找两个整数。 如果找到他们,返回他们。 如果流中有更多的数据,它不负责处理它们。 因此,你没有得到任何错误消息,如果有输入2个以上的数字。

我复制了为字int_swap字不同的例子,它似乎并不要么工作? 有任何想法吗?

你的版本int_swap似乎是罚款。



Answer 3:

好了,所以你要明白scanf函数实际上是如何表现的内部,了解它为什么不采取行动正常。

从scanf的手册页:

返回值

这些函数返回成功匹配,并分配输入项目,其可为少于规定的,或甚至零在早期匹配失败的情况下的数量。

值返回EOF如果第一转换成功或匹配故障发生之前达到输入的结束。 如果发生读取错误,在这种情况下,数据流的错误指示器(参见FERROR(3))被设置,并且设置errno指明错误也被返回EOF。

假设您有:

#include <stdio.h>

int main() {
    int x, y, rv;
    rv = scanf("%d %d", &x, &y);

    if(rv <  2) {
          fprintf(stderr, "Woops not enough arguments available on input\n");
          return -1;
    } 

    printf("X was %d and Y was %d\n", X, Y);
    return 0;
}

认为你正在经历不良行为的原因是因为你误解输入缓冲如何工作的,以及你感到困惑的事实,scanf函数会真正关心超出其格式字符串的结尾任何输入。

格式字符串的结束并不表明输入或标准输入的收盘结束。 所以,如果你想引起错误上面的代码,运行程序,如果你使用的是一些* nix中只需键入CTRL + d来表示对EOF stdin ,它会触发if提供的声明,你还没有进入2号。

顺便说一句:交换两个整数不使用临时变量

void swap(int *a, int *b) 
{
     *a ^= *b;
     *b ^= *a;
     *a ^= *b;
}

或者你可以定义一个宏:

#define swap(a, b) do { a ^= b; b ^= a; a ^= b; } while(0)


文章来源: using scanf to check input parameters
标签: c scanf