我想实现一个scanf()
,然后我找到implementation(我将其命名为new_scanf()
),它使用fgets()
从{{1}中的特定流中获取输入}}
这是我的测试程序,
vfscanf()
当我输入
时,此程序正常工作int main() {
int a, b;
new_scanf("%d", &a);
new_scanf("%d", &b);
printf("a=%d b=%d", a, b);
}
但是当我输入
时出了点问题123 <enter>
456 <enter>
a=123 b=456 ;program shows result correctly
不要被困在这里
123 456 <enter>
;the program is stuck here waiting for another input. scanf() should
的这种行为与glibc的new_scanf()
不同,我不知道如何解决它,任何人都可以告诉我如何完美地模仿scanf()
?
答案 0 :(得分:3)
当然,您无法使用scanf
来实现fgets()
来读取输入流,您必须使用getchar()
,getc(stdin)
或{{一次仔细读取一个字节1}}并放回不应与fgetc(stdin)
一起使用的第一个字节。正确实施ungetc()
是一项艰巨的任务。处理所有选项和格式的完整实现非常困难。
您引用的实现在文件开头有一个警告:
scanf()
它只处理非限定整数格式/*
* ** This not been very well tested.. it probably has bugs
*/
,d
,o
,u
和非标准x
,以及字符b
和字符串c
格式。不支持s
,long
或任何其他类型变体,不支持浮点,long long
的许多实例,其中大多数不正确...不是您自己实现的良好基础