当我尝试实现scanf()

时间:2016-03-01 21:38:07

标签: c scanf stdin glibc

我想实现一个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()

1 个答案:

答案 0 :(得分:3)

当然,您无法使用scanf来实现fgets()来读取输入流,您必须使用getchar()getc(stdin)或{{一次仔细读取一个字节1}}并放回不应与fgetc(stdin)一起使用的第一个字节。正确实施ungetc()是一项艰巨的任务。处理所有选项和格式的完整实现非常困难。

您引用的实现在文件开头有一个警告:

scanf()

它只处理非限定整数格式/* * ** This not been very well tested.. it probably has bugs */ dou和非标准x,以及字符b和字符串c格式。不支持slong或任何其他类型变体,不支持浮点,long long的许多实例,其中大多数不正确...不是您自己实现的良好基础