printf和gets之间的区别

时间:2010-08-16 00:18:45

标签: c printf

我是编程的初学者。我参考了C编程的书籍,但我很困惑。

1。)printf和gets之间的区别是什么? 我相信get更简单,没有任何格式?

3 个答案:

答案 0 :(得分:7)

的printf

printf函数将格式化的字符串写入标准输出。格式化字符串是将占位符替换为其值的结果。这听起来有点复杂,但通过一个例子会变得非常清楚:

   printf("Hello, my name is %s and I am %d years old.", "Andreas", 22);

此处%s%d占位符,用第一个和第二个参数代替。您应该在手册页(上面链接)上阅读占位符列表及其选项,但最常遇到的是%d(数字)和%s(字符串)。

确保占位符参数与其类型匹配非常重要。例如,以下代码将导致未定义的行为(意味着任何事情都可能发生:程序可能崩溃,可能有效,可能会损坏数据等):

printf("Hello, I'm %s years old.", 22);

不幸的是,在C中没有办法避免这些相对常见的错误。

gets函数用于完全不同的目的:它从标准输入中读取字符串。

例如:

char name[512];
printf("What's your name? ");
gets(name);

这个简单的程序会询问用户名称,并将他或她输入的内容保存到name

但是,gets()应该从不使用。它将打开您的应用程序及其运行的系统以防止安全漏洞。

从手册页引用:

  

永远不要使用gets()。因为它是   在不知道的情况下无法分辨   数据提前有多少个字符   gets()将读取,因为gets()   将继续存储过去的人物   缓冲区的结束,非常   使用危险。它已经习惯了   打破计算机安全。使用fgets()   代替。

以更简单的方式解释问题是,如果你给出的变量(在这种情况下为name)不足以容纳用户输入的内容,那么缓冲区将发生溢出,即{{ 1}}将写入变量的末尾。这是未定义的行为,在某些系统上,它将允许攻击者执行任意代码。

由于变量必须具有有限的静态大小,并且您无法设置用户可以键入的字符数限制作为输入,因此gets永远不会安全且永远不应使用。它只是出于历史原因而存在。

如手册所示,您应该使用fgets代替。它与gets()具有相同的目的,但有一个gets参数,用于指定变量的大小:

size

所以,上面的程序将成为:

char *fgets(char *s, int size, FILE *stream);

答案 1 :(得分:2)

他们从根本上执行不同的任务。

printf:将文本打印到控制台 获取:从键盘读入输入。

答案 2 :(得分:2)

printf:允许您从组件格式化字符串(即从变量中获取结果),当输出到stdout时,它不会追加换行符。您必须通过在格式字符串中插入'\ n'来完成此操作。

puts:只输出一个字符串到stdout,但后来追加了新行。

scanf:扫描输入字段,一次扫描一个字符,然后根据给定的格式进行转换。

gets:只是从stdin读取一个字符串,没有格式考虑,返回字符被字符串终止符'\ 0'替换。

http://en.wikipedia.org/wiki/Printf

http://en.wikipedia.org/wiki/Gets