我是编程的初学者。我参考了C编程的书籍,但我很困惑。
1。)printf和gets之间的区别是什么? 我相信get更简单,没有任何格式?
答案 0 :(得分:7)
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'替换。