首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scanf()中取的整数在C中没有得到它的预期值

在scanf()中取的整数在C中没有得到它的预期值
EN

Stack Overflow用户
提问于 2019-10-15 20:07:08
回答 2查看 1.2K关注 0票数 0

这是我的C代码:

代码语言:javascript
复制
#include "stdio.h"

int main()
{
  int minx, x;

  printf("Enter two ints: ");
  scanf( "%d-%d", &minx, &x);

   printf("You wrote: minx is %d x is %d", minx, x);
}

当输入是5-35- 3时,输出是,您写道: minx是5 x是3,这很有道理。但是,当输入为5 -35 - 36 -4时,输出为:minx为5 x是8。我期望-跳过空格,因此我期望minx5x3e 224E 1256E 226E 1274E 228用于其他输入。当- in %d-%d更改为?*+时,即使输入相同,也会发生这种情况。我知道这可能是因为在第一个int之后的那个空间。这里说只有三种格式说明符不能跳过空白- Whitespace before %c specification in the format specifier of scanf function in C。我搞错了吗?为什么-不跳过这里的前导空间?这里的实际问题是什么,原因是什么?为什么是8?其他的操作人员或字符会导致类似的问题吗?

EN

回答 2

Stack Overflow用户

发布于 2019-10-15 20:39:08

让我们详细看看您的scanf格式说明符"%d-%d"

如果需要的话,

  • %d跳过空格,然后读取integer
  • -匹配文字'-' character
  • %d跳过空格(如果需要),然后读取整数

因此,输入5-35- 3都工作得很好。但是当输入是5 -3 (或者-之前有空格的任何东西)时,解析就会失败,因为scanf没有立即看到它所期望的-

如果这不是您所期望的,或者不是您想要的,或者如果这是不合理的,或者如果这不是您希望scanf工作的方式,那么恐怕这太糟糕了:scanf的工作方式就是它的工作方式。

你怎么能解决这个问题?这在一定程度上取决于为什么首先在格式字符串中包含-字符。

  • 您可以使用%d%d%d %d,它只需读取两个整数(由至少一个空格字符分隔)。如果在第二个整数前面有一个-字符,则该整数将被读取,因为character.
  • You可以使用%d -%d,这将跳过(任意)空格,然后才能尝试匹配-,character.
  • You可以使用两个单独的scanf调用。如果继续使用scanf,则确实需要检查它的返回值,以便程序能够检测预期输入不是matched.
  • Finally,的情况--您可以使用scanf.

以外的其他东西。

我对你的推荐取决于这个计划的最终目的。

  • --如果它只是为了学习,那么尽量减少你花在程序输入方式上的时间。例如,如果需要读取整数,请使用一个%d。只要你能把你需要的数字输入到你的程序中(这样你就可以测试你的程序的其余部分),你就没事了。如果有什么东西可以让scanf感到困惑,那就不要担心,只是不要键入那些东西。不要尝试做任何花哨的事情--这不是scanf的目的。如果这是一个“真实”的程序,则必须接受任意的用户输入,或者使用特定语法的输入(比如在正确的位置使用- ),如果您需要优雅地处理不正确的输入、打印适当的错误、不读取错误的值或混淆--那么run, do not walk, away from scanf就永远不要再使用它了。实际上,编写一个使用scanf执行高质量输入的程序是不可能的.即使是C专家也做不到。这根本不值得。您将花费5倍的时间,得到一个差的结果,如果您只是简单地放弃scanf,一次用fgets等读取输入一行,然后解析输入行(甚至使用sscanf --但再次检查它的返回值)。

增编:没错,所有格式说明符--除了三个例外(%c%[…]扫描集和%n) --在开始工作之前跳过空白。但是格式说明符是从%开始的。格式字符串中的文字字符必须完全匹配,并且没有隐式空格跳过。如果要跳过输入点的空白,而不是在%格式说明符之前跳过空格,则可以在格式字符串中包含文字空白字符(通常为单个空格)。

票数 5
EN

Stack Overflow用户

发布于 2019-10-15 21:02:47

您需要检查scanf的返回值。通常,对于每个调用具有返回值的库函数,您都应该这样做。

在您的示例中,scanf将返回有效输入的2(意味着设置了两个输出参数)。如果获得任何其他返回值,则输入与指定的格式不匹配,因此应忽略输出参数minxx的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58401959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档