2016-12-27 7 views
1

EDIT: Хорошо, я слышал, вы, ребята, я выделил часть моего кода, которая вызывает у меня проблемы, скомпилировала ее и удостоверилась, что она все же дала мне те же результаты, вот она идет: Как и прежде, segfault появляется после первого экземпляра цикла for на strcpy (replace [j] -> utf8, strtok (data, "\ t")); Еще раз спасибо!Проблемы с использованием malloc, structs и, возможно, параметров

#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 

END EDIT

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

Поэтому я начинаю использовать C, и я пробовал все, что мог придумать, это похоже на довольно прямолинейную вещь, но, поскольку у меня такие проблемы, я вижу, что у меня есть некоторый пробел в моих знаниях. .

Я не буду беспокоить вас полным кодом, так как он работает отлично, просто я хотел сделать что-то по-другому, и вот когда началась проблема.

Короче я делаю программу, которая собирает набор символов типа UTF8, а также их замену ASCii, и сохраняет их в структуры, такие как

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

затем в основном я сделал таНос как это

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

Если мой мыслительный процесс является правильным, это может создать блок доступной памяти, в которой * заменить указывает на начальный адрес.

Тогда я сделал функцию, которая сканирует несколько UTF8 символов и их замену и хранит их в структурах, что-то вроде

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

теперь, после отладчика, кажется, что я создаю новые переменные заменить типа Replace **, который находится на совершенно другом адресе, но внутри этого адреса сохраняется значение в исходной структуре malloced, которую я прошел через параметр.

После этого я делаю

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

после отладки и поиска по адресам памяти, я вижу, что первый раз, когда я это сделать, первое положение таНос структуры действительно заполнены правом данных ,

с последующим

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); 

Я получаю ошибку сегментации после этой инструкции.

Так что вы, ребята, думаете? Правильно ли я приближаюсь к вещам, и я навязываюсь синтаксисом или чем-то подобным, или это база моих знаний ошибочна?

Спасибо, и поздно счастливые праздники!

+0

Без подлинного кода это описание кода сложнее, а ИМО недостаточно для определения ошибки сегментации. Было бы лучше, если бы все увидели истинный код. – chux

+0

Добро пожаловать в SO. Ознакомьтесь с этим https://stackoverflow.com/help/mcve, чтобы создать минимальный пример кода, создающего ошибку. –

+0

Вы не можете использовать 'Replac ** replace' так, чтобы вы только выделили один« Replac ». http://stackoverflow.com/questions/12462615/how-do-i-correctly-set-up-access-and-free-a-multidimensional-array-in-c – Stargateur

ответ

0
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.

Если ваши данные хранятся в виде текста, то это будет что-то вроде этого:

ABCDE\tABCDEFG123456\n 

Обратите внимание, что размер целого числа в десятичном формате в диапазоне от 0 до 10, так что размер не фиксирован. И есть (или должна быть) новая строка \n символов.

Значит, вы не хотите читать ровно 16 символов. Вы хотите писать, а затем читать 3 строки для каждой записи. Пример:

ABCDE\n 
ABCDEFG\n 
123456\n 

Если вы читаете в двоичной системе, а затем откройте файл в двоичном и использовать fwrite и fread. Пример:

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

Это зависит от того, как был создан ваш файл. Если вы пишете файл самостоятельно, тогда покажите код, который вы использовали для записи данных.

Также, ASCII является подмножеством Unicode. A в ASCII имеет то же представление, что и A в UTF8.

+0

Я ничего не пишу в файле, файл - это просто utf8char, за которым следует вкладка, за которой следует представление ascii, например вкладка Ç, C или £ tab фунт. – Crisapx