如何限制fscanf解释的字符数?

如何限制fscanf解释的字符数?,c,stdio,C,Stdio,我正在编写一个程序,从stdin读取数据,然后将读取的内容写入stdout,从而消除它找到的任何转义十六进制数。我想读的所有数字都是8位的。这就是我目前所拥有的 while((c = fgetc(stdin)) != EOF) { if(c == '%') { fscanf(stdin,"%x",&r); printf("%i \n",r); } } 这很好,除了在标准输入中写入类似%FFF的内容时,它会将其读取为3位十六进制数。如何将f

我正在编写一个程序,从
stdin
读取数据,然后将读取的内容写入
stdout
,从而消除它找到的任何转义十六进制数。我想读的所有数字都是8位的。这就是我目前所拥有的

while((c = fgetc(stdin)) != EOF) {
    if(c == '%') {
        fscanf(stdin,"%x",&r);
        printf("%i \n",r);
    }
}

这很好,除了在标准输入中写入类似
%FFF
的内容时,它会将其读取为3位十六进制数。如何将
fscanf
限制为仅读取2个字符?我曾考虑过将接下来的2个字符读入缓冲区并
sscanf
,但我觉得这很不雅观。

如果希望
scanf
(等)只读取两个字符,请告诉它这样做:

scanf("%2x", &r);

参见,例如,有关
scanf
格式的信息。

我以为我已经阅读了整个手册页,我想我错过了这一点。使用
fgets()
一次读取一行,使用
strchr()
查找
%
符号,并自己进行十六进制转换不是更有效吗?不?此外,这条溪流中没有线条。它是十六进制的。所以输入流仅由
%XX
组组成?(这不可能,因为那样的话,你怎么会有一个
%FFF
的问题呢?)填充缓冲区并处理缓冲区的内容,而不是为输入的每一个单独的字符执行单独的函数调用。为什么这样更有效?无论哪种方式,我仍然在相同数量的字符上运行相同数量的操作。唯一的区别是字符驻留在我自己提供的缓冲区中,而不是内核中的缓冲区。基本算法不会改变。