尝试使用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;
}
由于文档scanf
表示,
On success, the function returns the number of items of the argument list successfully filled.
它会返回已加载的不是你刚刚输入的项目数项目的数量。
解:
算上整数的数量,您SCANF之前。
如果我把在1个输入它只是让等待第二
在这一点上,如果输入流结束(如从管道数据的结束或者按平台特定键终止控制台输入),你会得到错误信息。
比方说,你建叫做可执行mytest
从上面的代码。 如果你使用:
echo 20 | ./mytest
你应该得到的错误消息。
如果我把3只是丢弃第三,什么我做永远不会返回错误信息。
你scanf
线查找两个整数。 如果找到他们,返回他们。 如果流中有更多的数据,它不负责处理它们。 因此,你没有得到任何错误消息,如果有输入2个以上的数字。
我复制了为字int_swap字不同的例子,它似乎并不要么工作? 有任何想法吗?
你的版本int_swap
似乎是罚款。
好了,所以你要明白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)