C 分段断块
大家好, 由于某种原因,我的代码中出现了一个分段错误 我几乎可以肯定错误在上面的小代码块中的某个地方,因为这是我为seg故障修改的全部内容,但我似乎无法确定它 我知道分段错误与访问我不应该访问的内存有关,但我甚至不确定我在代码中做了什么C 分段断块,c,segmentation-fault,C,Segmentation Fault,大家好, 由于某种原因,我的代码中出现了一个分段错误 我几乎可以肯定错误在上面的小代码块中的某个地方,因为这是我为seg故障修改的全部内容,但我似乎无法确定它 我知道分段错误与访问我不应该访问的内存有关,但我甚至不确定我在代码中做了什么 任何帮助都将不胜感激 代码的一些改进 读取/写入文件前检查fopen的结果 在使用变量值之前初始化变量 使用sizeof而不是注释中提到的常量 strtok可以返回NULL,必须对此进行检查,查看原因 您必须小心使用strncpy,因为 这是您的代码的更正版本
任何帮助都将不胜感激 代码的一些改进 读取/写入文件前检查fopen的结果 在使用变量值之前初始化变量 使用sizeof而不是注释中提到的常量 strtok可以返回NULL,必须对此进行检查,查看原因 您必须小心使用strncpy,因为 这是您的代码的更正版本
FILE *fp;
fp = fopen(filen, "wb");
const char tok[2] = ",";
char str[340];
while (fgets(str, 340, stdin) != NULL)
{
struct test loadTest;
printf("You entered: %s", str);
strncpy(loadTest.level, strtok(str, tok), 20);
strncpy(loadTest.first, strtok(NULL, tok), 30);
fwrite(&loadTest, sizeof(struct test), 1, fp);
}
fclose(fp);
您是否尝试调试代码?是否确定令牌的长度已固定为指定的20和30?调试器将告诉您SEGFULT发生的确切位置。使用它。如果您不知道如何使用调试器,那么现在可能是开始学习的好时机。请同时阅读以下内容:。不要使用strncpy,目标字符串可能不会以NUL结尾,请阅读并显示整个代码,而不仅仅是一部分。什么是文件?它是否已初始化?为什么不检查文件是否正确打开?如果fp==NULL返回;99%的用户表示您尚未打开文件且fp为空。请提供一个。这些都是改进,但不认为它们会停止seg故障。发表评论。@i486我需要发表什么评论?在发布答案之前,我已经对问题添加了评论。我认为出现SEGFULT是因为文件未成功打开。fopen之后的fp为NULL。您只能怀疑fopen是问题所在。它不是100%确定=>解决方案用于注释,它不是答案。@i486如果不查看整个代码,我就不能100%确定。只有OP能说出他为什么会出错。谢谢你的意见,但我不能在发布后删除答案。
FILE *fp;
fp = fopen(filen, "wb");
if (fp == NULL)
{
printf("Error opening file: %s", filen);
}
else
{
const char tok[2] = ",";
char str[340];
while (fgets(str, sizeof(str), stdin) != NULL)
{
struct test loadTest;
char *level;
char *first;
memset(&loadTest, 0, sizeof(loadTest));
printf("You entered: %s", str);
level = strtok(str, tok);
if (level == NULL)
{
continue; // bad input ?
}
first = strtok(NULL, tok);
if (first == NULL)
{
continue;
}
strncpy(loadTest.level, level, sizeof(loadTest.level)-sizeof(char));
strncpy(loadTest.first, first, sizeof(loadTest.first)-sizeof(char));
fwrite(&loadTest, sizeof(loadTest), 1, fp);
}
fclose(fp);
}