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

Tho*_*hom 5 c scanf format-specifiers

%n格式说明,在使用时scanf(),预计用于存储已经由所述功能处理成类型的参数的格式字符串的字符数的计数int*.据定义:

The number of characters of the format string already processed is stored in the pointed location.

但是在我的程序中,除了第一个之外它scanf()在所有scanf()程序中都有效.在我的程序中的所有s中,不包括第一个,它存储从控制台输入的字符总数的计数,包括换行符(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);
}
Run Code Online (Sandbox Code Playgroud)

样本输出

First Trial
253 
34  
4 
83
count=11

Second Trial
25
count=3

Third Trial
234 
38 
count=7

Fourth Trial 
3534
35
count=5
Run Code Online (Sandbox Code Playgroud)

为什么在第一次试验中我们得到"11"而不是"12?"这是我的疑问.

CRUCIAL EDIT

另一个发现.如果是第一个scanf(),而不是使用Enter键(换行符)来分隔输入的数字,如果我使用空格,大量的空格,那么所有这些空格也都计算在内.count例如我得到.count=21它意味着换行符,空间,一切都在考虑中.但为什么一审少于一次呢?

First Trial
25    35    38   98
count=21
Run Code Online (Sandbox Code Playgroud)

Dan*_*her 7

排除第一个,它存储从控制台输入的字符总数的计数,包括换行符(输入键)

你错误地解释了这一点.的scanf就做消耗用于将输入发送到节目的最后换行符,因此换行被留在缓冲器由消耗 scanf.除第一个之外的所有内容都scanf使用前一个输入中的换行作为第一个字符.

第一个scanf消耗八个数字加上四个数字之间的三个换行符,即11个字符.

第二个消息从第一个读取的第四个数字后scanf加上两个数字,产生3个字符.

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

第四个:换行符,四位数:5个字符.(然后换行+ 2位数b)

顺便说一句,你的报价

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

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

相应的参数应该是一个指向有符号整数的指针,到目前为止,通过调用fscanf函数将写入从输入流中读取的字符数.

  • `11 ="253 \n34 \n4 \n83"``3 ="\n25"``7 ="\n234 \n38"``5 ="\n3534"这是正确的吗? (2认同)