尝试使用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;
}
答案 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
声明。
if
或者你可以定义一个宏:
void swap(int *a, int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}