gpt4 book ai didi

c - 使用 malloc、结构和可能参数的问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:26:05 25 4
gpt4 key购买 nike

编辑:好吧,我听到你们了,我已经隔离了我的代码中给我带来问题的部分,编译它并确保它仍然给我相同的结果,这里是:和以前一样,段错误出现在 for 循环的第一个实例之后strcpy(replace[j]->utf8, strtok(data, "\t"));再次感谢!

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

#define max_chars 45
#define max_UTF 5
#define max_ASCII 7
#define max_word_length 30
#define max_line_length 70
#define max_texto_line 5000

typedef struct {
char utf8[max_UTF];
char ascii_seq[max_ASCII];
int count;
} Replac;


void getTable(FILE *f, char inputfile[],Replac **replace){
char data[max_line_length];
int j;
f = fopen( inputfile, "r" );
if (f == NULL) {
fprintf(stderr, "Can't open input file %s!\n",inputfile);
exit(1);
}

fgets(data,sizeof data,f);
for(j=0 ; strcmp(data,"\n") ; fgets(data,sizeof data,f), j++){
if (feof(f)) {
break;
}
strcpy(replace[j]->utf8, strtok(data, "\t"));
strcpy(replace[j]->ascii_seq, strtok(NULL, "\n"));
}
fclose(f);
}

int main( int argc, char *argv[] ){
Replac *replace=malloc(max_chars * sizeof(Replac));
FILE *fpr,*f,*fpw;
int carprocess = 0;
setlocale(LC_ALL,"pt_PT.UTF-8");
setlocale(LC_COLLATE,"pt_PT.UTF-8");


getTable(f,argv[1],&replace);
}

我从中复制字符的文本文件格式如下

UTFCHAR \tab asciichar

Á   'A

结束编辑

-#-##-###-####-####+#####+####p

所以我是一个使用 C 的初学者,我已经尝试了所有我能想到的,这似乎是一件非常简单的事情,但是因为我遇到了这样的麻烦,清楚地表明我在我的知识...

我不会用完整的代码来打扰你,因为它工作得很好,只是我想以不同的方式做事,这就是麻烦开始的时候。

简而言之,我正在做一个程序,收集一组 UTF8 类型的字符及其 ascii 替换,并将它们存储在结构中,例如

 typedef struct {
char utf8[max_UTF];
char ascii_seq[mac_ASCII];
} Replac;

然后在 main 中我像这样做了 malloc

Replac *replace=malloc(max_chars * sizeof(Replac));

如果我的思考过程是正确的,这将创建一个可用内存块,*replace 指向起始地址。

然后我创建了一个函数来扫描一些 UTF8 字符及其替换并将它们存储在结构中,比如

void getTable(FILE *f, char inputfile[],Replac **replace)

现在,在调试器之后,我似乎正在创建类型为 Replace** 的新变量替换,它位于一个完全不同的地址上,但在该地址内部存储了我通过参数。

之后我做了一个

strcpy(replace[0]->utf8, something I got from the table);

跟随调试器并搜索内存地址,我看到我第一次这样做时,malloc 结构的第一个位置确实填充了正确的数据。

其次是

strcpy(replace[0]->ascii_seq, corresponding ascii sequence to the previous UTF8 char);

然后填充内存块中的下一个内存位置。

所以我在调试我的变量 watch 时得到了类似的东西

地址 replace = (Replac **) 0xbf8104fc 包含 0x0878a008

address *replace = (Replac *) 0x0878a008 包含整个结构所以在地址 0x0878a008 中我得到了 utf8 字符的数据,然后在地址 0x0878a00d 中我得到了 ascii 序列。

问题在循环的下一个实例中,何时该

strcpy(replace[1]->utf8, something I got from the table);

我在该指令后遇到了段错误。

那么大家怎么看呢?我处理事情的方式是否正确,我是否被语法或类似的东西搞砸了,还是我的知识基础有缺陷?

谢谢,祝您节日快乐!

最佳答案

f = fopen( inputfile, "r" );
...
typedef struct
{
char utf8[max_UTF];
char ascii_seq[max_ASCII];
int count;
} Replac;
...
fgets(data,sizeof data,f);

您正在混合二进制和文本格式。

根据编译器,sizeof(Replac) 将为 16。这包括始终为 4sizeof(int)。如果大小不是 4 的倍数,也可能有填充。

如果您的数据存储为文本,那么它将是这样的:

ABCDE\tABCDEFG123456\n

请注意,十进制格式的整数大小介于 0 到 10 之间,因此大小不固定。并且有(或应该有)新行 \n 字符。

所以你不想正好读出 16 个字符。您想要为每条记录写入然后读取 3 行。示例:

ABCDE\n
ABCDEFG\n
123456\n

如果您正在以二进制方式读取,则以二进制方式打开文件并使用fwritefread。示例:

f = fopen( inputfile, "rb" );
Replac data;
fread(f, sizeof(data), 1, f);

这完全取决于您的文件是如何创建的。如果您自己编写文件,请显示您用于编写数据的代码。

此外,ASCII 是 Unicode 的一个子集。 ASCII 中的 A 与 UTF8 中的 A 具有完全相同的表示。

关于c - 使用 malloc、结构和可能参数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41353355/

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