gpt4 book ai didi

c - C 编程中的结构

转载 作者:行者123 更新时间:2023-11-30 18:20:17 24 4
gpt4 key购买 nike

我正在尝试读取文件内容并将它们存储到结构中,由于某种原因我不断遇到段错误。请帮助我,我也不太了解 valgrind。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
int day;
int month;
int year;
char text[401];
} journal;

int main(int argc, char** argv){
int i, numberEntries;
FILE* fp = fopen(argv[1], "r");

fscanf(fp,"%d", &numberEntries); /* reads value on first line of file for number of entries */
printf("%d", numberEntries); /* check that it worked */
journal *entryArray ;
entryArray = (journal*)malloc(sizeof(journal));

if(fp == NULL){
perror("Error opening file");
} else {

for(i=0; i<4; i++){
fscanf(fp,"%d/%d/%d", entryArray[i].day, entryArray[i].month, entryArray[i].year);
fgets(entryArray[i].text, 400, fp);
printf("%s", entryArray[i].text);
}
}
for(i=0; i<4; i++){
printf("%d %d %d", entryArray[i].day, entryArray[i].month, entryArray[i].year);
printf("%s", entryArray[i].text);
}
free(entryArray);
return 0;
}

更新的代码:仍然出现段错误。

typedef struct {
int day;
int month;
int year;
char text[401];
} journal;

int main(int argc, char** argv){
int i, numberEntries;
FILE* fp = fopen(argv[1], "r");

if(fp == NULL){
perror("Error opening file");
} else {
fscanf(fp,"%d", &numberEntries); /* reads value on first line of file for number of entries */
printf("%d", numberEntries); /* check that it worked */
journal *entryArray ;
entryArray = (journal*)malloc(numberEntries*sizeof(journal));
for(i=0; i<4; i++){
fscanf(fp,"%d/%d/%d", &entryArray[i].day, &entryArray[i].month, &entryArray[i].year);
fgets(entryArray[i].text, 400, fp);
printf("%s", entryArray[i].text);
}
for(i=0; i<4; i++){
printf("%d/%d/%d", entryArray[i].day, entryArray[i].month, entryArray[i].year);
printf("%s", entryArray[i].text);
}
free(entryArray);
}
return 0;
}

输入文件

4
12/04/2010
Interview went well I think, though was told to wear shoes.
18/04/2010
Doc advised me to concentrate on something... I forget.
03/05/2010
Was asked today if I was an art exhibit.
19/05/2010
Apparently mudcakes not made of mud, or angry wasps.

最佳答案

至少有三个原因可能(并且将会)导致程序中的段错误

  • 首先,您在程序中进行检查,以验证文件是否已成功打开。然而,您正尝试在检查之前从文件中读取数据

    fscanf(fp,"%d", &numberEntries);

    如果文件未成功打开,fopen返回空指针。尝试通过空文件指针读取任何内容会导致未定义的行为,这可能很容易表现为段错误。

  • 其次,您的entryArray始终只分配一个元素。然而您正在尝试访问 4 个元素。这也可能(并且将会)很容易导致段错误。

    顺便说一句,如果阅读numberEntries有什么意义呢?从文件中然后完全忽略该值?

  • 第三,fscanf%d格式需要一个指向 int指针作为相应的可变参数。您已提供int改为

    fscanf(fp,"%d/%d/%d", entryArray[i].day, entryArray[i].month, entryArray[i].year);

    这也会导致未定义的行为,通常伴随着段错误。从你的第一个来看fscanf你知道如何使用%dfscanf 。你是不是已经忘记了fscanf

如果文件打开成功,则有 99% 的可能性是第三个问题导致代码中出现段错误。这个问题先于第二个问题显现出来。

<小时/>

最后,您的输入数据的格式与您硬编码到程序中的格式不匹配。由于您正在使用 fgets紧接着 fscanftext数据必须与 day/month/year 位于同一行数据。同时,在您的输入文件中 text数据驻留在单独的行上。这肯定会让你的代码阅读脱轨。

在读取日期之后和执行 fgets 之前,您必须跳过该行的其余部分和换行符。 。一种方法是执行“假”fgets在做实际的fgets之前

for(i=0; i<4; i++){
fscanf(fp,"%d/%d/%d", &entryArray[i].day, &entryArray[i].month, &entryArray[i].year);
fgets(entryArray[i].text, 400, fp); // <- fake `fgets`
fgets(entryArray[i].text, 400, fp);
}

或者,您可以将尾随空格字符添加到 fscanf 中强制格式化fscanf消耗所有尾随空白

for(i=0; i<4; i++){
fscanf(fp,"%d/%d/%d ", &entryArray[i].day, &entryArray[i].month, &entryArray[i].year);
fgets(entryArray[i].text, 400, fp);
}

或者您可以使用更详细的 fscanf格式要求它消耗并忽略换行符之前的所有内容,然后忽略换行符本身

for (i = 0; i<4; i++){
fscanf(fp, "%d/%d/%d%*[^\n]\n", &entryArray[i].day, &entryArray[i].month, &entryArray[i].year);
fgets(entryArray[i].text, 400, fp);
}

这些不是最好的方法,但只要您的输入文件坚持硬格式,它们就可以工作。

关于c - C 编程中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26270099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com