c - 使用 memset() 获取“中止陷阱 6”
问题描述
我对 C 比较陌生,所以如果这是一个明显的问题,请多多包涵。我已经到处寻找答案,但无法弄清楚。
我正在编写一个简单的计算器——它将从用户那里进行计算(例如,“1 + 3”,然后返回结果。为了简单起见,我设置了输入缓冲区的长度并强制用户保持在这些范围内。如果他们输入的字符太多,我想提醒他们已经超出限制,并重置缓冲区以便他们可以重新输入。
当它们保持在限制之下时,此功能可以正常工作。当他们超过限制时,它也会正确地给他们一个消息。但是,当他们在输入无效计算后尝试输入有效abort trap: 6
计算时,我得到. 我知道这与我如何重置数组和管理该缓冲区的内存有关,但我的 C 技能还不够敏锐,无法自行诊断问题。
如果有人可以请看一下,我将不胜感激!我在下面粘贴了我的代码。
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#define BUFFER_SIZE 50
static void ready_for_input()
{
printf("> ");
}
static char *as_string(char buffer[], int size)
{
char *result = (char *)malloc((size + 1) * sizeof(char));
if (!result)
{
fprintf(stderr, "calculator: allocation error");
exit(EXIT_FAILURE);
}
for (int i = 0; i < size; i++)
{
result[i] = buffer[i];
}
// to make it a valid string
result[size] = '\0';
return result;
}
static char *read_line()
{
// put the input into a buffer
char buffer[BUFFER_SIZE], c;
int len = 0;
while (true)
{
c = getchar();
if (c == EOF || c == '\n')
{
// reset if input has exceeded buffer length
if (len > BUFFER_SIZE)
{
printf("Calculations must be under 100 characters long.\n");
memset(buffer, 0, sizeof(buffer));
len = 0;
ready_for_input();
}
else
{
return as_string(buffer, len);
}
}
else
{
buffer[len++] = c;
}
}
}
static void start_calculator()
{
ready_for_input();
char *line = read_line();
printf("input received : %s", line);
}
int main(int argc, char *argv[])
{
start_calculator();
}
解决方案
您不会阻止缓冲区溢出,因为您检查它为时已晚。在用户按下回车之前,您应该检查用户是否即将超出缓冲区的大小。
下面的代码稍微改进了检查缓冲区溢出的方式:
static char *read_line()
{
// put the input into a buffer
char buffer[BUFFER_SIZE];
int c; // getchar should be assigned to an int
int len = 0;
while (true)
{
c = getchar();
if (len >= BUFFER_SIZE)
{
// drop everything until EOF or newline
while (c != EOF && c != '\n')
c = getchar();
printf("Calculations must be under 100 characters long.\n");
memset(buffer, 0, sizeof(buffer));
len = 0;
ready_for_input();
}
else if (c == EOF || c == '\n')
{
return as_string(buffer, len);
}
else
{
buffer[len++] = c;
}
}
}
要注意的另一件事是gethchar()
应该将其分配给一个int
变量,而不是char
因为您正在检查 EOF(有关此的更多信息)
最后,您可能想要检查在 c 中读取行的更好方法,例如fgets
,为缓冲区动态分配内存,并在达到限制时使用(或realloc
和的组合)将大小加倍,或使用.malloc
memmove
getline
推荐阅读
- statistics - 不同分布的 MP 检验
- android - 我在使用 compile 'com.theartofdev.edmodo:android-image-cropper:2.7.+' 这个库来裁剪图像时遇到问题
- python - LabelEncoder fit_transform() 函数中的问题
- vba - excel vba - 创建一个包含数组条目的集合
- asp.net - ASP.NET MVC Identity vs ASP.Net core 2.1 Identity(它们之间的交叉身份验证)
- sql-server-2008 - 请清楚地解释 CTE 查询?
- reactjs - 我是否应该在 OAuth2 中使用 JWT 令牌来提供安全 API
- c++ - 如何保护非托管应用程序中的字符串免受进程转储
- java - System.gc() 收集仍然被局部变量引用的对象
- jquery - 带有全景缩放和工具提示的图像地图区域