Почему не получается strcmp сравнить строку из структуры и массив - строку?
Я снова чего-то не понимаю. Одна строка p->date.street из структуры char[20] имеет примерный вид Ленина______________ и вторая введенная пользователем с клавиатуры key_str, но приведенная к тому же ввиду, strcmp почему-то проходит мимо.
Проблема в функции search_for_key
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#include <Windows.h>
struct adres_book
{
char fio[32];
char street[20];
unsigned short int home;
unsigned short int flat;
char date[8];
} book;
struct tree {
int id;
struct adres_book data;
int balance;
tree * left;
tree * right;
};
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 * 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 (strcmp(p->data.street, data.street) > 0) {//p->id > ind // Левая ветка
p->left = tree_insert(p->left, ind, data, Vr, Hr);
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;
}
}
else if (strcmp(p->data.street, data.street) < 0) {//p->id < ind // Правая ветка
p->right = tree_insert(p->right, ind, data, Vr, Hr);
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;
}
void search_for_key(tree * p, char key_str[], char * key_dat) { // Поиск вершины по ключу
char a[20] = {};
for (int i = 0; i < 20; i++) { // Тут привожу key_str к такому же виду как запись в структуре
a[i] = key_str[i]; // т.е. добавляю пробелы до конца строки
if (key_str[i] == '\0')
while (i < 20) {
a[i] = ' ';
i++;
}
}
//Это значение переменных в режиме отладчика
//0x003bfab0 "ЌЁЄ®¤Ё¬®ў ...
//0x00636dcc "ЌЁЄ®¤Ё¬®ў ...
while (p != NULL) {
if (strcmp(a, p->data.street) == 0 )// Выдает false???????????????????
printf("\nResult search: \n%-4.d %s%s %3hu %3hu %s", p->id, p->data.fio, p->data.street, p->data.home, p->data.flat, p->data.date);
else if (strcmp(key_str, p->data.street) < 0)
p = p->left;
else if (strcmp(key_str, p->data.street) > 0)
p = p->right;
}
}
int main()
{
FILE * fp = fopen("BASE4.DAT", "rb");
tree * p = NULL;
boolean Hr; // Вертикальный рост дерева
boolean Vr; // Горизонтальный рост дерева
if (fp == NULL) {
printf("Error File!\n");
system("pause");
exit(1);
}
memset(&book, 0, sizeof(book));
int ind = 1;
//fread(&book, sizeof(book), 1, fp);
while (fread(&book, sizeof(book), 1, fp) == 1) {
printf("%-4.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 == 10 + 1)
break;
}
char search_street[20] = {};
char search_date[8] = {};
printf("\nEnter key street: ");
scanf("%s", search_street); // Тут вводим строку
search_for_key(p, search_street, search_date); // На второй параметр пока не обращаем внимания
fclose(fp);
system("pause");
}