我很难理解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)。
虽然可以使用%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说明符来确定是否已达到或是否事先发生了匹配失败。