gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:59:10 26 4
gpt4 key购买 nike

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

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

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

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

#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);
}

示例输出

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

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

关键编辑

另一个发现。如果对于第一个 scanf(),而不是使用 Enter 键(换行符)来分隔输入的数字,如果我使用空格,则会有很多空格,然后所有这些空格也由 count 计算。例如我得到 count=21。这意味着换行符,空格,一切都在考虑中。但为什么会这样一审少

First Trial
25 35 38 98
count=21

最佳答案

excluding the first one,it stores the count of the total number of characters entered from the console,including the newlines (Enter keys)

您误解了这一点。 scanf消耗用于将输入发送到程序的最终换行符,因此换行符留在缓冲区中以供下一个<消耗/em> 扫描。除了第一个 scanf 之外的所有内容都将前一个输入的换行符作为第一个字符。

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

第二个使用第一个 scanf 中读取的第四个数字之后的换行符,加上两个数字,组成 3 个字符。

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

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

顺便说一句,你的报价

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

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

The corresponding argument shall be a pointer to signed integer into which is to be written the number of characters read from the input stream so far by this call to the fscanf function.

关于c - 为什么 %n 格式说明符对所有 scanf() 语句都正常工作,但在第一个语句中少存储一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16623296/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com