使用scanf检查输入参数

时间:2014-05-31 07:44:53

标签: c scanf

尝试使用scanf检查我有适量的输入(在这种情况下为2),并且代码工作正常,但如果我输入1输入它只是等待一秒钟,如果我放入3它只丢弃第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;
}

3 个答案:

答案 0 :(得分:2)

正如scanf的文件说的那样

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

它将返回已加载的项目数,而不是您刚刚输入的项目数。

<强>溶液

在扫描之前计算整数。

答案 1 :(得分:0)

  

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

此时,如果输入流结束(如管道中的数据结束或按平台特定键终止控制台输入),您将收到错误消息。

我们假设你从上面的代码中构建了一个名为mytest的可执行文件。如果您使用:

echo 20 | ./mytest

你应该收到错误信息。

  

如果我输入3它只丢弃第3个,我做的任何事都不会返回错误信息。

您的scanf行查找两个整数。如果它找到它们,它将返回它们。如果流中有更多数据,则不负责处理它们。因此,如果输入中有超过2个数字,则不会收到任何错误消息。

  

我逐字逐句地复制了一个不同的int_swap示例,它似乎也没有用?有什么想法吗?

您的int_swap版本似乎没问题。

答案 2 :(得分:0)

好的,所以你必须了解scanf在内部的实际行为,以了解它为什么不能正常运作。

从scanf手册页:

  

返回值

     

这些函数返回输入项的数量   成功匹配和分配,可能少于提供的数量   在早期的情况下,甚至为零          匹配失败。

     

如果在任何一个之前到达输入结尾,则返回值 EOF   第一次成功转换或匹配失败。 EOF 是   如果发生读错误也会返回,在这种情况下会出错   设置流的指示符(请参阅 ferror (3)),并设置errno表示错误。

让我们说你有:

#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实际上会关心其格式结尾之外的任何输入这一事实感到困惑字符串。

格式字符串的结尾不表示输入结束或关闭stdin。所以在上面的代码中,如果你想引发错误,运行程序,如果你使用的是* nix,只需输入 CTRL + D 来表示{{1}上的EOF如果您没有输入2个数字,它会触发stdin声明。

Aside:在不使用临时变量

的情况下交换两个整数
if

或者你可以定义一个宏:

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