Я пытаюсь сравнить 2 текста из файлов побайтно, используя memcmp, после того, как я прочитал оба из них в память, один файл в буфер (char * или char [], пробовал оба). проблема в том, что файл, который я читаю в буфер, имеет много 0 байтов, что заставляет его останавливаться на первых 0 байтах, думая, что это нулевой завершающий ноль, что вызывает ошибку сегментации. как сделать так, чтобы функция продолжала сравнивать байты даже при наличии 0 байтов?
Я уже пытался проверить, заполнен ли буфер или нет, я распечатал его побайтово, и он показал все байты, включая 0 байтов. когда я полностью его печатаю с использованием printf ("% s", буфер), я получаю только первый байт (второй байт равен 0 байт).
void detect_virus(char *buffer, unsigned int size){
link* l = (link*) malloc(sizeof(link));
load(l);
unsigned int location = 0;
while(l != NULL){
location = 0;
while(location < size - l->vir->SigSize){
int isVirus = memcmp(buffer + location, l->vir->sig, l->vir->SigSize);
if(isVirus == 0)
printf("%d, %s, %d\n", location, l->vir->virusName, l->vir->SigSize);
location++;
}
}
free(l);
}
void detect(link* list){
char filename[50];
fgets(filename, 50, stdin);
sscanf(filename, "%s", filename);
FILE* file = fopen(filename, "rb");
char* buffer = (char*) malloc(10000);
fseek(file, 0, SEEK_END);
unsigned int size = ftell(file);
fseek(file, 0, SEEK_SET);
fread(buffer, 1, size, file);
detect_virus(buffer, size);
fclose(file);
}
Я получаю ошибку сегментации при первом вызове функции memcmp вместо полного сравнения текстов. есть идеи как это исправить?
редактировать
код для load
функции:
void load(link* list){
printf("Enter Viruses file name: \n");
char* filename = (char*) malloc(100);
fgets(filename, 100, stdin);
sscanf(filename, "%s", filename);
FILE* file = fopen(filename, "r");
while(!feof(file)){
short length = 0;
fread(&length, 2, 1, file);
if(length == 0)
break;
struct virus* v = (struct virus*)malloc(length);
fseek(file, -2, SEEK_CUR);
fread(v, length, 1, file);
v->SigSize = v->SigSize - 18;
list_append(list, v);
}
list = list->nextVirus;
free(filename);
fclose(file);
}
как примечание, я проверял функцию раньше, и она работала.
редактировать
Я обнаружил проблему, спасибо всем!