为什么%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