C-使用malloc,结构和可能参数的问题



编辑:好的,我听到你们,我已经隔离了我的代码的部分,这些代码给我带来了问题,并确保它仍然给了我相同的结果,这里去:与以前一样,segfault在for循环的第一个实例之后出现strcpy(替换[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

ex

Á   'A

结束编辑

- # - ## - ### - #### - #### ##### #### P

所以我是使用C的初学者,我已经尝试了所有我能想到的,这似乎是一件很直截了当的事情,但是由于我遇到的麻烦很明显,这表明我有一些差距知识...

我不会打扰您的完整代码,因为它正常工作,只是我想以不同的方式做事,这就是麻烦开始的时候。

简而

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

然后在Main中我像这样做了

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

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

然后,我做出了一个扫描一些UTF8字符及其替代品的功能,并将它们存储在结构中,例如

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

现在,在调试器之后,看来我正在创建新的变量替换类型替换**,它在完全不同的地址上,但是在该地址内部,该地址将其值存储给我通过我通过的原始Malloced结构参数

之后我做

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

在调试器之后并浏览记忆地址,我看到我第一次这样做时,Malloc结构的第一个位置确实充满了正确的数据。

接着

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

,这填充了内存块中的下一个内存位置。

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

地址替换=(替换**)0xbf8104fc,其中包含0x0878a008

地址 *替换=(替换 *)0x0878a008包含整个结构因此,在地址0x0878a008中,我获得了UTF8 char的数据,然后在地址0x0878A00D上获得了ASCII SEQ。

循环的下一个实例中的问题,该是时候

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。这包括sizeof(int)始终是4。如果大小不是4的倍数,也可能会有填充。

如果您的数据被存储为文本,则将是这样的:

ABCDEtABCDEFG123456n

请注意,十进制格式的整数大小在0到10之间的任何位置,因此尺寸未固定。并且有(或应该有)新行n字符。

因此,您不想完全阅读16个字符。您想编写,然后为每个记录阅读3行。示例:

ABCDEn
ABCDEFGn
123456n

如果您在二进制中读取,请用二进制打开文件并使用fwritefread。示例:

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

这一切都取决于您的文件的创建方式。如果您自己编写文件,请显示用于编写数据的代码。

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

        strcpy(replace[j]->utf8, strtok(data, "t"));                   

我在该指令后得到了分段故障。

您刚刚犯了错误的命令。您首先使用[j]订阅,然后用->订阅,就好像我们对Replac s有一系列指针一样。但是,我们宁愿指向(第一个元素)Replac s数组的指针,因此,我们必须首先取消指针,然后下注。e。而不是

                replace[j]->utf8

我们必须写

                (*replace)[j].utf8

或等效

                (*replace+j)->utf8

相关内容

  • 没有找到相关文章

最新更新