编辑:好的,我听到你们,我已经隔离了我的代码的部分,这些代码给我带来了问题,并确保它仍然给了我相同的结果,这里去:与以前一样,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
如果您在二进制中读取,请用二进制打开文件并使用fwrite
和fread
。示例:
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