扫描功能故障(C)

时间:2015-04-03 10:45:03

标签: c monodevelop scanf

我有以下代码:

struct punto richiedi_punto () {
static int count=1;
struct punto point;

do {
printf("Inserire coordinate del punto %i:", count);
scanf("%d;%d",&point.x,&point.y);

} while (point.x<0 || point.x>9 || point.y<0 || point.y>9);
count++;

return point;
}

Gcc没有发现错误,但我收到了这个警告:

Warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]

我试图在谷歌上找到解决方案,但我不明白导致此警告的原因。

提前致谢。

编辑:我刚才注意到,如果我在MonoDevelop控制台中运行我的程序,我无法插入我的坐标(为什么?),但如果我在gnome-terminal中运行它,它可以正常工作。

4 个答案:

答案 0 :(得分:2)

看一下scanf manual:函数的返回值是了解函数是否成功的唯一方法。

在这里,您的编译器不喜欢您的代码,因为您甚至不会查看返回值,因此即使函数失败,您的代码也会继续。

这里的失败非常简单,例如,如果输入不是数字,或者不包含&#39 ;;&#39;正如所料,或其他。

所以只需用以下内容替换scanf行:

if (scanf("%d;%d",&point.x,&point.y) != 2)) {}

应该向Gcc保证,向他表明你关心的是返回值。 但最干净的解决方案是存储返回值并根据需要做一些事情,看看&#34;返回值&#34;手册的一部分以获取更多信息。

答案 1 :(得分:1)

scanf()返回成功转换的字段数,供您检查

int fields;
do {
    printf("Inserire coordinate del punto %i:", count);
    fields = scanf("%d;%d",&point.x,&point.y);
} while (fields != 2 || point.x<0 || point.x>9 || point.y<0 || point.y>9);

正如@chux所指出的,上述情况并不好。以下是使用sscanf而非scanf的版本。

#include <stdio.h>

int main()
{
    int fields, x, y;
    char inp[100];
    do {
        printf("Inserire coordinate:");
        fgets(inp, 100, stdin);
        fields = sscanf(inp, "%d;%d",&x,&y);
    } while (fields != 2 || x<0 || x>9 || y<0 || y>9);
    printf("x=%d, y=%d\n", x, y);
    return 0;
} 

答案 2 :(得分:-1)

Scanf返回no.of输入从用户成功获取的值。警告您忽略了该返回值。

所以你可以像这样使用,

int ret;
ret=scanf("%d;%d",&point.x,&point.y);

否则,

(void*)scanf("%d;%d",&point.x,&point.y);

答案 3 :(得分:-1)

这意味着您不检查scanf的返回值。
如果只设置了point.x或point.y,则scanf可以返回1,如果既未设置point.x或point.y,则返回0。

您可以检查scanf的返回值以删除此警告

int ret = scanf("%d;%d",&point.x,&point.y);
if (ret != 2) 
{
    printf("Error whith scanf");
    return 0;
}