关于如何解决C语言中缓冲区溢出问题

简介: 关于如何解决C语言中缓冲区溢出问题

前言:在C语言初始练习中,经常在使用scanf语句中出现缓冲区溢出问题,作者也面临了多次,最终找到合适的解决方法。请看以下内容

1.什么叫做缓冲区溢出

 在使用如scanf,fgets的输入函数时,电脑会将用户输入的内容存储到缓冲区中,接下来使用输出函数从缓冲区中获取用户输入的内容。如果我们定义了一个具有一定长度字符串变量,而输入的字符串长度超过了所定义的长度,多余的字符串会从缓冲区溢出,跑到内存中,而内存是存储变量的,如果发生缓冲区溢出,则字符串可能会覆盖变量,导致程序崩溃。

2.解决缓冲区溢出的四个方法

(1)使用scanf函数的宽度限制

//宽度限制格式:%ns,n为整数,表示最多存储的字符串长度。
char str [100];
scanf("%99s",&n);

 (2)使用带长度限制的输入函数,如fgets

char str [100];
fgets(str,sizeof(str),stdin);//最多读取100个字符
//这里复习下fgets标准输入函数
//stdin标准文件流,fgets会从标准文件流中读取用户输入的内容,而且与scanf不同的一点是,fgets函数在读取时,会将/n也存储到字符串中。

(3)提前增加一个字符串长度(存储\n)

char str [100];
scanf("%99s",&n);

(4)设计程序进行输入数据验证

//保证用户输入的是正整数
int i = 0;
do
{
  printf("请输入一个正整数\n");
  scanf("%d",&n);
}while(i<=0);//只要输入是非零数,就一直执行语句


目录
相关文章
|
2天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
1天前
|
C语言
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
17 0
|
1天前
|
C语言
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
4 0
|
1天前
|
C语言
C语言——函数递归
C语言——函数递归
4 0
|
1天前
|
C语言
C语言—函数(大化小方式的心脏)
C语言—函数(大化小方式的心脏)
2 0
|
2天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
15 2
|
2天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
2天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
2天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
2天前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)