【问题标题】:scanf integer with %ld %ld is not work correctly带有 %ld %ld 的 scanf 整数无法正常工作
【发布时间】:2020-04-11 08:38:55
【问题描述】:

我使用的是 gcc 4.4.7。

当我在简单逻辑(C 语言)下运行时。

然后输入'1 2'。

 int var1 = 0; 
 int var2 = 0;

 if(!scanf("%ld %ld",&var1, &var2))
 {
    printf("--- ERROR\n");
 }
 else
 {
    printf("--- var1  [%ld] \n", var1);
    printf("--- var2  [%ld] \n", var2);
 }

结果: --- 变量1 [0] --- var2 [2]

我已经知道 %ld 适用于 long int。我真正想知道的是 scanf 的详细工作原理。 当我尝试扫描 2 个或更多数字时会发生这种情况。

【问题讨论】:

  • int 不是long。将声明改为long int var1
  • 我已经知道如何解决这个问题了。我想知道为什么 var2 分配正确但 var1 没有。
  • 这是因为您应该使用%d 格式来匹配int。另外,请不要检查来自scanf! 的返回值,而是预期的转化次数:if(scanf("%d %d", &var1, &var2) != 2)
  • @WeatherVane 你能解释更多细节吗?如果只是不正确,则不应分配它们。但事实并非如此。
  • @HyunyoungGo 导致Undefined Behavior,请查看我的答案,我将 Weather Vane 和 Mark Ronson 的评论合并。

标签: c gcc scanf undefined-behavior


【解决方案1】:

格式说明符%ld 用于long int%lld 用于long long int)。

int 应与%d 格式说明符匹配。使用与变量类型一致的格式说明符会导致未定义行为。

不要使用 ! 运算符检查 scanf 的返回值,而是使用预期的转换次数,如下所示:

if(scanf("%d %d", &var1, &var2) != 2)
  printf("--- ERROR\n");

进一步阅读
What happens when I use the wrong format specifier?

【讨论】:

  • 未说的关键点是使用与变量类型不一致的格式会导致未定义的行为。在那之后试图理解任何事情都是毫无价值的。
  • @R.. 即使这会随着不同的编译器版本而改变。试图对未定义的行为进行推理是让自己发疯的好方法。
  • @MarkRansom:对于漏洞利用,你只需要知道你的目标是用什么编译它的。如果他们使用主流的二进制发行版,这很容易。
猜你喜欢
  • 2016-09-19
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 2018-11-03
  • 2020-05-17
相关资源
最近更新 更多