正如标题所说,我正在尝试去年的问题,要求我编写一个与scanf()相同的程序。 Ubuntu的:
这是我的代码:
#include<unistd.h>
#include<stdio.h>
int main()
{
int fd=0;
char buf[20];
read(0,buf,20);
printf("%s",buf);
}
现在我的程序不能完全相同。 我怎么做可以存储整数和字符值,因为我的给定代码只需要字符串。 另外,我如何使我的输入接收任意数量的数据(在这种情况下只有20个字符)。
答案 0 :(得分:1)
彻底完成这项工作是一项非常重要的工作。
您展示的内容并不能很好地模仿sscanf("%s", buffer);
。至少有两个问题:
请注意,系统调用无法提供“unget”功能;必须由FILE *
类型提供。使用文件流,可以保证一个字符的后推。我最近在限制上做了一些empirical research,找到了推回字符数从1(AIX,HP-UX)到4(Solaris)到'big'的值,意味着最多4 KiB,可能更多,在Linux和MacOS X(BSD)上。幸运的是,scanf()
只需要一个后退字符。 (嗯,这是通常的说法;我不确定在区分“1.23e + f”和“1.23e + 1”时是否可行;第一个需要三个前瞻字符,在我看来,它才能分辨出来e+f
不是数字的一部分。)
如果您正在编写scanf()
的插件替代品,则需要使用<stdarg.h>
机制。幸运的是,格式字符串后scanf()
的所有参数都是数据指针,并且所有数据指针的大小都相同。这简化了代码的某些方面。但是,您将解析扫描格式字符串(本身就是一项非平凡的练习;请参阅最近对print format string parsing的讨论),然后安排进行适当的转换和分配。
除非您有异常严格的条件,否则假设您将使用字符级标准I / O库函数,例如getchar()
,getc()
和ungetc()
。如果您甚至无法使用它们,那么请编写自己的变体。请注意,与其他I / O函数的完全集成是棘手的 - 像fseek()
这样的事情会使事情变得复杂,并确保推回的字符被正确使用也不是完全无关紧要。