使用scanf检查输入参数

尝试使用scanf检查我有适当数量的输入(在这种情况下为2),并且代码工作正常,但如果我输入1输入它只是等待一秒钟,如果我放入3它只是丢弃第三,我做的任何事都不会返回错误信息。 已经找到了答案,但找不到我可以使用的任何东西,我问的原因是我用于这个主题的教科书的代码与我在这里完全相同(我复制了一个不同的例子为int_swap字为一句话,它似乎也没有用?任何想法?对不起,如果这是一个愚蠢或简单的问题。

#include  #include  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; } 

正如scanf的文档说的那样

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

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

解:

在扫描之前计算整数。

如果我输入1输入它只是等待一秒钟

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

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

 echo 20 | ./mytest 

你应该收到错误信息。

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

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

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

您的int_swap版本似乎没问题。

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

从scanf手册页:

返回值

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

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

让我们说你有:

 #include  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来指示stdin EOF, if你没有输入2个数字,它将触发if语句。

旁白:在不使用临时变量的情况下交换两个整数

 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)