【问题标题】:Scanf function testscanf功能测试
【发布时间】:2017-03-04 09:36:44
【问题描述】:

scanf 成功转换为请求格式的输入字符(在本例中为十进制整数"%d")时,它返回一个1,表示“转换成功”。

好吧,恐怕我没有正确理解它。

我想使用此功能立即过滤输入:如果输入不是整数(正或负),则请求另一个输入。

#include<stdio.h>
#include<stdlib.h>

int main(){
        int x;
        printf("\nThis function reads an integer\n");
        while(scanf("%d", &x) != 1){
                printf("Please type an integer:\n");
                scanf("%d", &x);
        }
        printf("\n%d is really an integer!\n", x);
        return 0;
}

但在这种情况下,输入2.15scanf 只读取数字2,然后成功关闭循环。

【问题讨论】:

  • 也许您想使用浮点格式和类型?或者您可以读取整行(例如fgets)然后使用strtol 转换为整数?使用strtol,您可以检查转换结束的位置,以及它是否转换了整个字符串。
  • 为什么要用2次scanf?
  • @tilz0R 不是第一个 (scanf("%d", x) == 1) 逻辑条件吗?
  • 为什么还有另一个?首先 scanf 已经将数据放到你的 X 中了。
  • OP 应该注意到的真实情况是,如果对scanf() 的第一次调用失败,那么第二次调用也将失败。这是因为当“输入/转换”失败时,不再输入可用字符,因此当第二次调用 scanf() 时,相同的失败字符仍在输入流中

标签: c while-loop scanf


【解决方案1】:

%d 基本上与strtol 的工作方式相同:它丢弃空格,然后读取数字直到遇到第一个非数字字符并将读取的数字转换为整数值。如果至少读取了一位数字,则认为转换成功,无论“停止读取”的字符是什么。

因此,在您的情况下,. 是一个非数字字符,但 2 已被读取,因此转换仅使用字符串 "2" 并成功。

要解决这个问题,您首先需要考虑您希望允许哪些字符结束一个整数(. 显然不在其中)。然后读取字符直到遇到其中一个字符,然后使用 strtol 转换之前读取的所有字符。

【讨论】:

  • 那么,我过滤输入的方法是不可行的。谢谢你的建议!
【解决方案2】:

Scanf 会按照您的要求执行:它从输入流中读取一个整数,并忽略无法解释为 int 的其余部分。

如果您想进行输入过滤,最好将整行读取为字符串(例如使用fgets),解析输入并采取相应措施。

【讨论】:

  • 感谢您的建议!
  • 这是不正确的。对scanf() 的调用没有丢弃以下字符。以下字符仍在输入流中,等待处理。
  • 这就是我所说的“丢弃”。 @user3629249
  • 尽管如此,我还是更改了措辞以减少混淆。感谢@user3629249 的更正。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多