2015-04-03 114 views
1

我有以下代码:故障与scanf函数(C)

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中运行它,它通常工作。

+0

从scanf中删除';'(在2%之间) – 2015-04-03 10:47:15

+0

什么是x和y的类型?你能给完整的代码吗? – Mukit09 2015-04-03 10:47:32

+0

@karma_geek,为什么? – 2015-04-03 11:50:13

回答

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; 
} 
+0

'while(fields!= 2 || point.x <0 ....'是一个好主意,但处理'fields!= 2'可能需要一个不同的路径,然后循环。用户输入如“12 x 34”会导致无限循环。 – chux 2015-04-03 13:03:03

+0

@chux这就是为什么我讨厌'scanf'。 – 2015-04-03 14:29:14

+0

我们可以希望C的下一个版本会发送'gets()'一个叫做'scanf()'? – chux 2015-04-03 14:43:21

-1

Scanf返回输入no.of成功获得的值。警告你是忽略该返回值。

所以,你可以使用这样,

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

否则,

(void*)scanf("%d;%d",&point.x,&point.y); 
-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; 
} 
2

看一看的scanf manual:函数的返回值是你要知道,如果函数成功的唯一途径。

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

这里的失败很容易,例如,如果输入不是数字,或者不包含';'如预期的那样,或其他。

所以才更换scanf函数一行是这样的:

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

应该安抚GCC,显示他你关心的返回值。 但最简洁的解决方案是存储返回值并根据所做的操作,查看手册的“返回值”部分以获取更多信息。