我才学习C语言几天,所以不太确定这段代码有什么问题:
#include <stdio.h>
int main(int argc, char * argv[]) {
int sides;
printf("Please enter length of three sides :\n");
scanf("%d", &sides);
return 0;
}
我收到的错误信息如下:
忽略scanf的返回值
我在这里做错了什么,我该怎么办才能解决这个问题?
我才学习C语言几天,所以不太确定这段代码有什么问题:
#include <stdio.h>
int main(int argc, char * argv[]) {
int sides;
printf("Please enter length of three sides :\n");
scanf("%d", &sides);
return 0;
}
我收到的错误信息如下:
忽略scanf的返回值
我在这里做错了什么,我该怎么办才能解决这个问题?
你可能会编写代码
if (scanf("%d", &sides) >0) {
printf("you want %d sides.\n", sides);
}
else printf("You did not enter any number.\n");
scanf函数有几个作用:
sides = scanf("%d", &sides);
是错误的。你不应该像这样两次使用相同的 sides
变量。 - Basile Starynkevitch这是一个警告,阻止编译器执行其任务(设置过于严格)。检查scanf()函数的返回值是否存在错误,警告应该会消失。
返回值
成功时,该函数返回成功读取的项数。此计数可以与预期的读取数量匹配或更少,甚至为零,如果发生匹配失败。在任何数据成功读取之前发生输入故障的情况下,将返回EOF。
scanf
返回“项”的数量,即在格式字符串中传递的值(例如,单个项目是 %d
、%c
等等),以及后续传递给 scanf
的参数。例如,要读取由逗号和空格分隔的两个整数,您可以使用:
int x, y;
int items = scanf("%d, %d", &x, &y);
assert(items == 2);
我在上面已经透露了我的建议 - 如果你只是想读取它,而不是添加未使用的变量,那么可以添加一个断言:
#include <assert.h>
/* ... */
assert(scanf("%d", &sides) > 0);
/* ... */
很遗憾,assert(scanf("%d", &sides));
不够安全,因为 EOF 会返回 -1
。这样做将非常优雅。
我认为,如果您不想在此情况下使用未初始化的变量 (sides
) 继续进行程序,则应采用这种方式。
或者,您可以将 scanf
的结果捕获到一个变量中,并像其他答案中那样优雅地处理它。
scanf
的返回值赋给一个变量。它是一个整数计数,表示读取了多少个字符。如果这对你很重要,那么最好将其保存。int count = scanf("%d", &sides);
这样无害的语句也足以消除警告。虽然我必须承认,在gcc 4.6上,我没有收到相同的警告。 - Makotoscanf()
函数返回一个整数值;如果你不打算使用它,你可以在你的scanf
语句的开头简单地添加(void)
,像这样: (void)scanf("%d", &sides);
scanf
的返回值!你打算如何处理它? - vszscanf
的返回值并不是严格的错误,而且你的编译器只是在提供更多的帮助,但你应该真正考虑忽略任何I/O操作的返回值是一个编程(或至少是思维)错误。所有的I/O都有可能失败,一个没有处理这种情况的程序本质上是不正确的。 - Kerrek SB