C 检测到堆栈崩溃,但字符数组在限制范围内
我试图理解我做错了什么。来自键盘的输入在字符数组限制内。。。 即使输入长度为8个字符,也会抛出一个错误。只要字符长度为6个字符,它就可以正常工作 这是我的代码(我可以发誓它一直工作到1小时前)C 检测到堆栈崩溃,但字符数组在限制范围内,c,stack-smash,C,Stack Smash,我试图理解我做错了什么。来自键盘的输入在字符数组限制内。。。 即使输入长度为8个字符,也会抛出一个错误。只要字符长度为6个字符,它就可以正常工作 这是我的代码(我可以发誓它一直工作到1小时前) #包括 #包括 #包括 #包括 #包括“functions.h” #定义SLEN 81 #定义文件名“./database.txt” void add_成员(字符*名称); 内部主(空) { 字符名称[SLEN],姓氏[SLEN],地址[SLEN]; 未签名的整数日期、开始日期、结束日期; 添加_成
#包括
#包括
#包括
#包括
#包括“functions.h”
#定义SLEN 81
#定义文件名“./database.txt”
void add_成员(字符*名称);
内部主(空)
{
字符名称[SLEN],姓氏[SLEN],地址[SLEN];
未签名的整数日期、开始日期、结束日期;
添加_成员(&name[SLEN]);
返回0;
}
void add_成员(字符*名称)
{
文件*文件;
if((file=fopen(file_NAME,“a”))==NULL)
{
printf(“无法打开文件%s\n”,文件名);
退出(退出失败);
}
fputs(“插入名字:”,标准输出);
fgets(name,SLEN,stdin);//问题似乎出现在这里
check_string(name);//这是在另一个文件中定义的
FPUT(名称、文件);
printf(“添加到数据库的名称:%s\n”,名称);
如果(fclose(文件)!=0)
printf(“关闭文件%s\n时出错”,文件名);
printf(“文件:%s已关闭\n”,文件名);
}
这是不正确的,因为&name[SLEN]
是数组末尾之后的字节。需要的是阵列的开始
添加_成员(名称)代码>或添加_成员(&name[0])代码>添加成员(&name[SLEN])代码>-->添加成员(名称)代码>。前者错误地将指针传递到数组结束后的一个字节。谢谢,工作正常。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "functions.h"
#define SLEN 81
#define FILE_NAME "../database.txt"
void add_members(char *name);
int main(void)
{
char name[SLEN], surname[SLEN], address[SLEN];
unsigned int dob, start_date, end_date;
add_members(&name[SLEN]);
return 0;
}
void add_members(char *name)
{
FILE *file;
if ((file = fopen(FILE_NAME, "a")) == NULL)
{
printf("cant open file %s\n", FILE_NAME);
exit(EXIT_FAILURE);
}
fputs("Insert FIRST NAME: ", stdout);
fgets(name, SLEN, stdin); // appears the problem to be here
check_string(name); // this is defined in another file
fputs(name, file);
printf("Name added to database: %s\n", name);
if (fclose(file) != 0)
printf("error in closing file %s\n", FILE_NAME);
printf("File: %s closed\n", FILE_NAME);
}
add_members(&name[SLEN]);