scanf
、gets
和fgets
都是C语言中用于从标准输入读取数据的函数,但它们之间存在一些重要的差异:
- scanf:
scanf
是一个格式化输入函数,它可以根据指定的格式从标准输入读取数据。- 使用
scanf
读取字符串时,需要小心处理缓冲区溢出的问题,因为scanf
不会自动检查目标缓冲区的大小。 scanf
在读取字符串时遇到空格、制表符或换行符会停止。
- gets:
gets
函数从标准输入读取一行,直到遇到换行符为止,并将换行符替换为字符串结束符\0
。gets
不检查目标缓冲区的大小,因此非常容易导致缓冲区溢出,引发安全问题。因此,在现代C语言编程中,gets
函数已被弃用。
- fgets:
fgets
函数也从标准输入读取一行,直到遇到换行符或达到指定的最大字符数。fgets
会将换行符一起读入字符串(如果需要可以手动去除),并在字符串末尾添加\0
。fgets
允许指定一个最大字符数,从而可以防止缓冲区溢出,更加安全。
示例代码:
使用scanf:
#include <stdio.h>
#include <string.h> #define BUFFER_SIZE 50 int main() { int number; char string_scanf[BUFFER_SIZE]; // 使用 scanf 读取整数和字符串 printf("输入一个数字:\n"); scanf("%d", &number); printf("使用scanf输入一个字符串:\n"); scanf("%49s", string_scanf); // 限制字符串长度为49,防止溢出 // 打印读取到的数据 printf("scanf输出的数字: %d\n", number); printf("scanf输出的字符串: %s\n", string_scanf); return 0;
}
运行结果:
使用gets(不推荐使用):
#include <stdio.h>
#include <string.h> #define BUFFER_SIZE 50 int main() { char string_gets[BUFFER_SIZE]; // 使用 gets 读取字符串(不推荐使用) printf("使用gets输入一个字符串:\n"); gets(string_gets); // 不安全的,可能导致缓冲区溢出 // 打印读取到的数据 printf("gets输出的字符串: %s\n", string_gets); return 0;
}
运行结果:
使用fgets:
#include <stdio.h>
#include <string.h> #define BUFFER_SIZE 50 int main() { char string_fgets[BUFFER_SIZE]; // 使用 fgets 读取字符串 printf("使用fgets输入一个字符串:\n"); fgets(string_fgets, BUFFER_SIZE, stdin); // 读取最多 BUFFER_SIZE-1 个字符 // 去除 fgets 读取的字符串末尾的换行符(如果存在) string_fgets[strcspn(string_fgets, "\n")] = 0; // 打印读取到的数据 printf("fgets输出的字符串: %s\n", string_fgets); return 0;
}
运行结果: