【发布时间】:2020-05-27 05:58:24
【问题描述】:
我真的是新手。我使用 scanf 从输入中读取并将其分配给变量。当我 printf 变量时,它会打印 1 而不是零。这是我的代码:
#include <stdio.h>
int main()
{
int a = scanf("%d", &a);
printf("%d", a);
return 0;
}
【问题讨论】:
我真的是新手。我使用 scanf 从输入中读取并将其分配给变量。当我 printf 变量时,它会打印 1 而不是零。这是我的代码:
#include <stdio.h>
int main()
{
int a = scanf("%d", &a);
printf("%d", a);
return 0;
}
【问题讨论】:
scanf 成功返回 1:
int a = scanf("%d", &a);
将其更改为:
int a;
scanf("%d", &a);
【讨论】:
if(scanf... 来避免未初始化的变量。 stackoverflow.com/questions/27104910/…
int a = scanf("%d", &a); 定义a 以scanf 的返回值进行初始化,并要求scanf 将转换后的值放入a。这是错误的。使用:
int a;
scanf("%d", &a);
scanf 返回分配的项目数或EOF,如果在第一次匹配完成之前发生输入失败。您可以使用它来测试输入是否已成功处理。
【讨论】:
你应该使用类似的东西:
#include <stdio.h>
int main(void)
{
int a;
int n = scanf("%d", &a);
if (n != 1)
{
fprintf(stderr, "Failed to read an integer (%d)\n", n);
return 1;
}
printf("%d\n", a);
return 0;
}
变量n 允许您区分EOF(通常为-1)和“空格后的第一个数据不是整数的一部分”(n 将包含0)。
请注意,错误消息打印在标准错误上;这就是它的用途。您通常应该在输出消息的末尾打印一个换行符。
您可以决定不使用n,然后不在错误消息中打印它:
#include <stdio.h>
int main(void)
{
int a;
if (scanf("%d", &a) != 1)
{
fprintf(stderr, "Failed to read an integer\n");
return 1;
}
printf("%d\n", a);
return 0;
}
测试来自scanf() 的结果仍然很重要,这样如果用户输入zero 而不是0,您就可以发现问题。
请注意,如果匹配失败,则不会分配 a — 因此,如果没有测试,您将打印一个未初始化的变量,这不是一个好主意。您可以定义 int a = 0; 来避免该问题(您可以选择任何您喜欢的 int 初始化程序)。
【讨论】: