Bor*_*ucu 0 c input scanf output
这是我的 C 代码:
\n\n#include "stdio.h"\n\nint main()\n{\n int minx, x;\n\n printf("Enter two ints: ");\n scanf( "%d-%d", &minx, &x);\n\n printf("You wrote: minx is %d x is %d", minx, x);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n当输入为5-3或5- 3时,输出为You write: minx is 5 x is 3这是有道理的。但是,当输入为5 -3或5 - 3或6 -4时,输出为You write: minx is 5 x is 8。我期望-跳过空格,所以我期望其他输入的minx为5,x为3、6和4 。-当in%d-%d更改为?,时*,+即使输入相同,也会发生这种情况。我知道这可能是因为第一个 int 之后的空格。这里说只有三个格式说明符不跳过空格 \xe2\x80\x94 C 中 scanf 函数的格式说明符中 %c 规范之前的空格。我是不是搞错了?为什么-这里不跳过前导空格?这里的实际问题是什么?其原因是什么?为什么是8?还有哪些其他运算符或字符会导致类似的问题?
让我们详细看看您的scanf格式说明符:"%d-%d"
%d如有必要,跳过空格,然后读取整数-匹配文字\'-\'字符%d如有必要,跳过空格,然后读取整数所以输入5-3和5- 3两者都工作得很好。但是,当输入5 -3(或在 之前有空格的任何其他内容-)时,解析失败,因为scanf没有立即看到-它期望的内容。
如果这不是您所期望的,或者不是您想要的,或者如果这没有意义,或者如果这不是您想要的scanf工作方式,那么我担心”太糟糕了:scanf按其工作方式工作。
你该如何解决这个问题?这部分取决于您-首先在格式字符串中包含该字符的原因。
%d%dor %d %d,它将简单地读取两个整数(由至少一个空格字符分隔)。-如果第二个整数前面有一个字符,则该整数将被读取为负数。%d -%d,它会在尝试匹配-字符之前跳过(任意)空白。scanf调用。scanf,您确实需要检查它的返回值,以便您的程序可以检测到预期输入不匹配的情况。scanf.我对您的推荐取决于该计划的最终目的。
\n%d。只要您能够将所需的数字输入到您的程序中(以便您可以测试程序的其余部分),就可以了。如果您输入的某些内容会导致您scanf感到困惑,请不要担心,只是不要输入这些内容即可。不要尝试做任何花哨的 \xe2\x80\x94 这不是的事情scanf。-正确的位置),并且如果您需要优雅地处理不正确的输入,打印适当的错误,以及没有读取错误的值或感到困惑 \xe2\x80\x94 然后运行,不要步行,远离scanf,并且永远不再使用它。实际上不可能编写使用 执行高质量输入的程序scanf。即使是 C 专家也做不到。这根本不值得。您将花费五倍的时间,并获得较差的结果,而不是简单地放弃并使用类似的scanf方法一次读取一行输入,然后解析输入行(甚至可能使用\xe2\x80\x94 但再次,检查其返回值)。fgetssscanf附录:确实如此,除三个例外(%c、%[\xe2\x80\xa6]扫描集和%n) \xe2\x80\x94 之外,所有格式说明符 \xe2\x80\x94 在开始工作之前都会跳过空格。但格式说明符是以 . 开头的东西%。格式字符串中的文字字符必须完全匹配,并且它们不会隐式跳过空格。如果您想跳过输入中除%执行此操作的格式说明符之前以外的位置处的空格,则可以在格式字符串中包含文字空白字符(通常是单个空格)。