Символ чего \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


Ответы (0 шт):