当格式化文本不匹配时,C 中的 scanf 不会失败

Tom*_*Chu 4 c scanf

我很难理解scanfC 语言是如何工作的。我需要下面的代码才能因输入而失败123 foo

#include <stdio.h>

int main () {
  int i;
  if (scanf ("%d text", &i) != 1) {
      return 1;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在C refs中发现它正确scanf返回了成功分配的参数的数量(在我的例子中有 1 个说​​明符),因此我可以看到为什么if满足语句中的条件(整数i被正确分配)。但是我不知道如何检查参数的其余部分是否也满足( string text)。

And*_*zel 5

虽然可以使用%n说明符来确定到目前为止读取的字符数,但问题是这不会增加由 . 返回的赋值计数scanf。因此,很难判断是否scanf实际写入了%n说明符对应的参数,或者是否事先发生了匹配失败,导致该参数保持不变scanf

这个问题可以通过将变量的值初始化为一个可以与scanf写入该变量的值区分开来的值来解决。在下面的示例中,我将变量初始化为值-1

#include <stdio.h>

int main( void )
{
    int i;
    int chars_read = -1;

    if (
        scanf( "%d text%n", &i, &chars_read ) != 1
        ||
        chars_read == -1
    )
    {
        printf( "Bad input!\n" );
        return 1;
    }

    printf( "Good input.\n" );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在此程序中,我们实际上不需要知道读取的字符数(这是说明符的主要目的%n)。相反,我们仅使用%n说明符来确定是否已达到或是否事先发生了匹配失败。