Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么%n格式说明符对所有scanf()语句都正常工作,但在第一个语句中存储的却少了一个?_C_Scanf_Format Specifiers - Fatal编程技术网

为什么%n格式说明符对所有scanf()语句都正常工作,但在第一个语句中存储的却少了一个?

为什么%n格式说明符对所有scanf()语句都正常工作,但在第一个语句中存储的却少了一个?,c,scanf,format-specifiers,C,Scanf,Format Specifiers,%n格式说明符在scanf()中使用时,应将函数已处理的格式字符串的字符数计数存储到int*类型的参数中。根据定义: 已处理的格式字符串的字符数存储在指定位置。 但是在我的程序中,除了第一个scanf()之外,它在所有scanf()中都是这样工作的。在我的程序中,除了第一个之外,它存储从控制台输入的字符总数,包括换行符(Enter键)。但是在第一个scanf()中,该计数小于从控制台输入的字符和换行符总数 请解释这个异常,因为我无法检测到这个简单的bug,这真的很令人沮丧 #include &l

%n
格式说明符在
scanf()
中使用时,应将函数已处理的格式字符串的字符数计数存储到
int*
类型的参数中。根据定义:

已处理的格式字符串的字符数存储在指定位置。

但是在我的程序中,除了第一个
scanf()
之外,它在所有
scanf()
中都是这样工作的。在我的程序中,除了第一个之外,它存储从控制台输入的字符总数,包括换行符(Enter键)。但是在第一个
scanf()
中,该计数小于从控制台输入的字符和换行符总数

请解释这个异常,因为我无法检测到这个简单的bug,这真的很令人沮丧

#include <stdio.h>

int main ()
{
    int a,b,c,d,count;

    printf("First Trial\n");
    scanf("%d%d%d%d%n",&a,&b,&c,&d,&count);  //OUTPUT ANOMALY HERE
    printf("count=%d\n",count);

    printf("Second Trial\n");
    scanf("%d%n",&a,&count);
    printf("count=%d\n",count);

    printf("Third Trial\n");
    scanf("%d%d%n",&a,&b,&count);
    printf("count=%d\n",count);

    printf("Fourth Trial\n");
    scanf("%d%n%d",&a,&count,&b);
    printf("count=%d",count);
}
为什么在第一次试验中我们得到的是“11”而不是“12”?这是我的疑问

关键编辑

另一个查找。如果是第一个
scanf()
,请输入
键(换行)要分隔输入的数字,如果我使用空格,大量的空格,那么所有这些空格也都会按
count
进行计数。例如,我得到
count=21
。这意味着换行符、空格、所有内容都在考虑之中。但为什么第一次试用时会少一个

First Trial
25    35    38   98
count=21
除第一个字符外,它存储从控制台输入的字符总数的计数,包括换行符(回车键)

您误解了这一点。
scanf
s不使用用于将输入发送到程序的最终换行符,因此换行符留在缓冲区中,供下一个
scanf
使用。除第一个
scanf
外,其他所有字符都将前一个输入的换行符作为第一个字符使用

第一个
scanf
使用八位数字加上四个数字之间的三个换行符,即11个字符

第二个使用在第一个
scanf
中读取的第四个数字后的换行符,加上两位数字,即3个字符

第三个:换行符,三位数,换行符,两位数:7个字符

第四个:换行符,四位数:5个字符。(然后换行符+2位数表示
b

顺便说一下,你的报价是多少

已处理的格式字符串的字符数存储在指定位置

不正确,不是格式字符串的字符数,而是从输入流读取的字符数:

相应的参数应为指向的指针 要写入从中读取的字符数的有符号整数 调用fscanf函数到目前为止的输入流


如果第一个
scanf()
不使用用于发送输入的换行符,那么您如何解释计数11?没有其他描述,因为字符总数为8(第一个scanf()的所有数字的位数加起来),没有其他描述其他
scanf()中的计数
s如果我们假设没有使用换行符也是如此。实际上,该行是从Cplusplusreference中提取的。但我知道它的意思,即使它是以错误的方式编写的……我知道它是指从输入流读取的字符。无论如何,您如何解释第一个
scanf()的11计数
如果不使用换行符?
11=“253\n34\n4\n83”
3=“\n25”
7=“\n234\n38”
5=“\n3534”
是否正确?
First Trial
25    35    38   98
count=21