Символ чего \x1 в C?
Откуда он берется, как его убрать? Прилетает в передаваемый массив в функцию.
Из функции search в проверке if(memcmp(key_str, p->data.date) == 0 && compare(key_dat, p->data.date)) Когда находит последнюю строку удовлетворяющую условию, в функцию compare(char* date1, char* date2) в date2 прилетает этот символ. Причем до перехода от функции к функции, т.е. в p->data.date его нет, в compare(..., date2) он уже есть. И все рушится.
Картинка до
[![введите сюда описание изображения][1]][1]
Картинка после
[![введите сюда описание изображения][2]][2]
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#include <Windows.h>
int dat[3] = { 0 };
int ids = 0;
struct adres_book {
char fio[32];
char street[20];
unsigned short int home;
unsigned short int flat;
char date[8];
} book;
typedef struct tree {
int id;
struct adres_book data;
int balance;
tree * left;
tree * right;
};
typedef struct list {
char st[20] = "";
unsigned short int count;
list * next;
};
list * init_list(char d[]) {
list * head = (list*)malloc(sizeof(list));
for (int i = 0; i < 20; i++)
head->st[i] = d[i];
head->next = NULL;
return head;
}
void add_list_begin(list * lst, char d[]) {
list * tmp;
list * q;
tmp = (list*)malloc(sizeof(list));
for (int i = 0; i < 20; i++)
tmp->st[i] = d[i];
tmp->next = NULL;
q = lst;
while (q->next != NULL) {
q = q->next;
}
q->next = tmp;
}
void list_unique(list* lst) {
list* t, *p, *i, *prev;
int s = 0;
for (p = lst; p != NULL; p = p->next) {
prev = p;
for (i = p->next; i != NULL; ) {
if (memcmp(i->st, p->st, 20) == 0) {
s++;
t = prev->next = i->next;
free(i);
i = t;
continue;
}
prev = i;
i = i->next;
}
p->count = s;
s = 1;
}
}
tree * node_new(int ind, adres_book data) { // Добавление нового элемента структуры
tree * node = new tree;
if (!node)
return NULL;
node->id = ind;
node->data = data; // Присваиваем данные
node->balance = 0;
node->left = NULL; // Указываем потомков
node->right = NULL;
return node;
}
tree * left(tree * p, boolean &Vr, boolean &Hr) {
tree * q;
if (Vr) {
if (p->balance == 0) {
q = p->left;
p->left = q->right;
q->right = p;
p = q;
q->balance = 1;
Vr = false;
Hr = true;
}
else {
p->balance = 0;
Hr = true;
}
}
else {
Hr = false;
}
return p;
}
tree * right(tree * p, boolean &Vr, boolean &Hr) {
tree * q;
if (Vr) {
p->balance = 1;
Vr = false;
Hr = true;
}
else if (Hr) {
if (p->balance > 0) {
q = p->right;
p->right = q->left;
p->balance = 0;
q->balance = 0;
q->left = p;
p = q;
Vr = true;
Hr = false;
}
else {
Hr = false;
}
}
return p;
}
tree * tree_insert(tree * p, int ind, adres_book data, boolean &Vr, boolean &Hr) { // Вставка элемента в дерево
tree * q;
if (p == NULL) {
p = node_new(ind, data);
Vr = true;
return p;
}
if (memcmp(data.street, p->data.street, 20) < 0) { // Левая ветка
p->left = tree_insert(p->left, ind, data, Vr, Hr);
p = left(p, Vr, Hr);
}
else { // Правая ветка
p->right = tree_insert(p->right, ind, data, Vr, Hr);
p = right(p, Vr, Hr);
}
return p;
}
void parse_date(char * date) {
char day[2];
char mounth[2];
char year[2];
int i = 0;
int j = 0;
while (date[i] != '-') {
day[i] = date[i];
i++;
}
i++;
while (date[i] != '-') {
mounth[j] = date[i];
i++;
j++;
}
i++;
j = 0;
while (date[i] != NULL) {
year[j] = date[i];
i++;
j++;
}
dat[0] = (int)atoi(day);
dat[1] = (int)atoi(mounth);
dat[2] = (int)atoi(year);
}
int max_date(int date1[], int date2[]) {
int dat1[3] = { 0 };
int dat2[3] = { 0 };
for (int i = 0; i < 3; i++) dat1[i] = date1[i];
for (int i = 0; i < 3; i++) dat2[i] = date2[i];
if (dat1[2] > dat2[2])
return 1;
else if (dat1[2] == dat2[2])
if (dat1[1] > dat2[1])
return 1;
else if (dat1[1] == dat2[1])
if (dat1[0] > dat2[0])
return 1;
else
return 2;
else
return 2;
else
return 2;
}
boolean compare(char * date1, char * date2) {
int arr_date1[3] = { 0 };
int arr_date2[3] = { 0 };
parse_date(date1);
for (int i = 0; i < 3; i++) arr_date1[i] = dat[i];
parse_date(date2);
for (int i = 0; i < 3; i++) arr_date2[i] = dat[i];
if (max_date(arr_date1, arr_date2) == 2)
return true;
return false;
}
void prt(tree * p) {
ids++;
printf("%-3.d %-4d ", ids, p->id);
for (int i = 0; i < 32; i++) printf("%c", p->data.fio[i]);
printf(" ");
for (int i = 0; i < 20; i++) printf("%c", p->data.street[i]);
printf(" %3hu %3hu ", p->data.home, p->data.flat);
for (int i = 0; i < 8; i++) printf("%c", p->data.date[i]);
printf("\n");
}
void normal_str(char street[]) {
for (int i = 0; i < 20; i++)
if (street[i] == '\0')
while (i < 20) {
street[i] = ' ';
i++;
}
}
void search_key(tree * p, char key_str[], char * key_dat) {
if (p->left) {
search_key(p->left, key_str, key_dat);
}
if (memcmp(key_str, p->data.street, 20) == 0 && compare(key_dat, p->data.date))
prt(p);
if (p->right) {
search_key(p->right, key_str, key_dat);
}
}
void print_all_street(tree * p, list * h) {
if (p->left) {
print_all_street(p->left, h);
}
add_list_begin(h, p->data.street);
if (p->right) {
print_all_street(p->right, h);
}
}
void print_list(list * h) {
int i = 0;
while (h != NULL) {
i++;
printf("%-4.d ", i);
for (int i = 0; i < 20; ++i) printf("%c", h->st[i]);
printf(" >%d \n", h->count);
h = h->next;
}
printf("All count: %d\n", i);
}
int main()
{
FILE * fp = fopen("BASE4.DAT", "rb");
tree * p = NULL;
list * h = NULL;
list * head = NULL;
boolean Hr; // Вертикальный рост дерева
boolean Vr; // Горизонтальный рост дерева
if (fp == NULL) {
printf("Error File!\n");
system("pause");
exit(1);
}
int ind = 1;
//fread(&book, sizeof(book), 1, fp);
while (fread(&book, sizeof(book), 1, fp) == 1) {
printf("%-5.d ", ind);
for (int i = 0; i < 32; ++i) printf("%c", book.fio[i]);
printf(" ");
for (int i = 0; i < 20; ++i) printf("%c", book.street[i]);
printf(" %3hu %3hu ", book.home, book.flat);
for (int i = 0; i < 8; ++i) printf("%c", book.date[i]);
Hr = true;
Vr = true;
p = tree_insert(p, ind, book, Vr, Hr);
ind++;
puts("");
if (ind == 20)
break;
}
h = init_list(p->data.street);
char search_street[20] = {};
char search_date[8] = {};
printf("\nEnter key street: ");
scanf("%s", search_street);
normal_str(search_street);
printf("\nEnter key date: ");
scanf("%s", search_date);
search_key(p, search_street, search_date);
printf("\n");
print_all_street(p, h);
list_unique(h);
print_list(h);
fclose(fp);
system("pause");
}
Т.е. между картинками одно нажатие F11 [1]: https://i.stack.imgur.com/geZiZ.png [2]: https://i.stack.imgur.com/R2kWz.png