fgets比gets更安全,已成为替代选择。1. gets因不进行边界检查,易导致缓冲区溢出,已被c标准移除;2. fgets通过指定最大读取字符数(size-1),有效防止溢出;3. fgets会保留换行符,需手动去除;4. fgets返回buffer指针,失败或eof时返回null,可用于判断读取状态。
和
都是 C 语言中用于从标准输入读取字符串的函数,但它们之间存在显著的区别,主要体现在安全性上。
函数由于不进行边界检查,容易导致缓冲区溢出,因此已被弃用。
函数则提供了一定的安全性,允许指定读取的最大字符数,从而避免缓冲区溢出。
解决方案
函数从指定的流(通常是标准输入
)读取字符串,直到读取到换行符(
),文件结束符(
),或者读取了
个字符为止。读取到的字符串会包含换行符,并在字符串末尾添加一个空字符
。
函数则直接从标准输入读取字符串,直到遇到换行符为止,并将换行符替换为空字符
。
立即学习
“
C语言免费学习笔记(深入)
”;
由于
不进行边界检查,如果输入的字符串长度超过了目标缓冲区的长度,就会发生缓冲区溢出,可能导致程序崩溃或者被恶意利用。
通过指定最大读取字符数,可以有效地防止缓冲区溢出。
fgets 如何避免缓冲区溢出?
函数接受一个
参数,用于指定读取的最大字符数。它最多读取
个字符,并在字符串末尾添加一个空字符
。这样,即使输入字符串的长度超过了
,
也只会读取前
个字符,从而避免了缓冲区溢出。
例如:
在这个例子中,
函数最多读取 9 个字符,加上一个空字符
,总共 10 个字符,正好是
的大小。如果输入的字符串超过 9 个字符,
会截断字符串,保证不会发生缓冲区溢出。
为什么 gets 被弃用,fgets 成为推荐选择?
web售票系统+C#语言+Sql2000数据库
系统设置:密码修改 增加用户(权限) [打印机设置 票样打印设置 这2块用不着实现系统界面上 放着就好了]基础设置:基础参数设置(买票设置/订票设置/退票设置)(比如多少时间之前不能买票订票) 车票设置(标准票/儿童票/。。。增删改) 车辆设置(增删该) 车次设置(增删该) 运营计划设置(调度设置)前台营业:销售车票
下载
函数最大的问题在于其不安全性。由于它不进行边界检查,如果输入的字符串长度超过了目标缓冲区的长度,就会发生缓冲区溢出。这使得
函数成为黑客攻击的目标,他们可以利用缓冲区溢出漏洞来执行恶意代码。
为了解决这个问题,C 标准委员会在 C99 标准中建议不要使用
函数,并在 C11 标准中将其完全移除。
函数由于其安全性,成为替代
函数的推荐选择。
fgets 的返回值是什么?如何判断读取是否成功?
函数的返回值是指向
的指针,如果读取成功。如果发生错误或者到达文件结束符(
),则返回
。
可以通过检查
的返回值来判断读取是否成功。如果返回值为
,则表示读取失败,需要进行错误处理。
如何去除 fgets 读取的字符串中的换行符?
函数会将换行符
也读取到字符串中。如果不需要换行符,可以使用以下方法将其去除:
这段代码首先使用
函数获取字符串的长度,然后判断最后一个字符是否为换行符。如果是,则将其替换为空字符
。
总而言之,
是一个比
更安全、更可靠的函数,应该优先使用
来从标准输入读取字符串。理解
的工作原理和使用方法,可以有效地避免缓冲区溢出,提高程序的安全性。
fgetsgetsgetsfgetsfgetsstdin\nEOFsize - 1\0gets\0getsfgetsfgetssizesize - 1\0size - 1fgetssize - 1#include
int main() {
char buffer[10];
printf("请输入字符串:");
fgets(buffer, sizeof(buffer), stdin);
printf("你输入的字符串是:%s", buffer);
return 0;
} fgets\0bufferfgetsgetsgetsgetsfgetsgetsfgetsbufferEOFNULLfgetsNULL#include
int main() {
char buffer[10];
printf("请输入字符串:");
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
printf("读取失败!\n");
return 1;
}
printf("你输入的字符串是:%s", buffer);
return 0;
} fgets\n#include
#include
int main() {
char buffer[10];
printf("请输入字符串:");
fgets(buffer, sizeof(buffer), stdin);
// 查找换行符并替换为空字符
size_t len = strlen(buffer);
if (len > 0 && buffer[len - 1] == '\n') {
buffer[len - 1] = '\0';
}
printf("你输入的字符串是:%s", buffer);
return 0;
} strlen\0fgetsgetsfgetsfgets