Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2013, 21:43   #1
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию лишние данные в char[]

здравствуйте, вот код:
Код:
#include "stdafx.h"
#include "hash.h"

void main()
{
	setlocale( LC_ALL, "Russian");
	hash h;
	List l;
	char command[12];
		h.Add("AAAA-AAAAAB","Евгения Дубакова");
		h.Add("AAAA-AAAABA","Василий Буйневич");
		h.Add("DBQP-MFEUDG","Даниил Букин");
		h.Add("ZPER-FDMCPR","Галина Ивановна");
		h.Add("QVJA-GPEMCQ","Юлия Самородина");
		h.Add("DZVE-WPHDSB","Михаил Горбов");
		h.Add("QFVB-FEMZVD","Василий Бондарев");
		h.Add("REMA-AVZCGF","Николай Вотинов");
		h.Show();}
вот код в hash.h

Код:
#include <string.h>
#include "SupportFunctions.h"

struct Logers
{
	char passport[11];
	char FIO[255];
	int year;
	char addres[255];
	char quest[255];
	bool flag;
};
const int size = 1500;
class hash
{
private:
	Logers * l[size];
public:
	void Add(char passport[11],char FIO[255]);
	void Search(char passport[11]);
	void Delete(char c[]);
	void Show();
	void Remove();
	int Key(char c[]);
	hash();
	~hash();
};

int hash::Key(char c[11])
{
	return c[0]+c[1]+c[2]+c[3]+c[5]+c[6]+c[7]+c[8]+c[9]+c[10];
}

void hash::Add(char passport[11],char FIO[255])
{
	int i=1,a=3,d=7,tkey=0;
	tkey=hash::Key(passport);
	while(hash::l[tkey]!=0)
	{
		if(hash::l[tkey]->flag)
		{
			tkey=(tkey+a*i+(d*(i*i)))%1500;
		}
	}
	hash::l[tkey] = new Logers();
	strcpy(hash::l[tkey]->passport,passport);
	strcpy(hash::l[tkey]->FIO,FIO);
	hash::l[tkey]->flag=true;
}

void hash::Search(char c[11])
{
	int i=1,a=3,d=7;
	int tkey=hash::Key(c);
	static Logers * t;
	
	while(hash::l[tkey]!=0)
	{
		if(hash::l[tkey]->flag)
		{
			t = hash::l[tkey];
			if(what(c,hash::l[tkey]->passport) == 0)
			{
				printf("Паспорт: %s\n", hash::l[tkey]->passport);
				printf("Фамилия имя отчество: %s\n", hash::l[tkey]->FIO);
				//printf("Год рождения: %d\n", hash::l[tkey]->year);
				//printf("Адрес: %s\n", hash::l[tkey]->addres);
				//printf("Цель прибытия: %s\n",, hash::l[tkey]->quest);
				//printf("Паспорт: \n");
				break;
			}
		}
		tkey=tkey+a*i+(d*(i*i));
	}
}

//зацикливается
void hash::Delete(char c[])
{
	int i=1,a=3,d=7;
	int tkey=hash::Key(c);
	while(hash::l[tkey]!=0)
	{
		if(hash::l[tkey]->flag)
		{
			if(what(c,hash::l[tkey]->passport) == 0)
			{
				//delete hash::l[tkey]->addres;
				//delete hash::l[tkey]->FIO;
				//delete hash::l[tkey]->quest;
				//hash::l[tkey]->year=0;
				hash::l[tkey]->flag=true;
				delete hash::l[tkey]->passport;
				break;
			}
		}
		tkey=tkey+a*i+(d*(i*i));
	}
}

void hash::Remove()
{
	for(int i=0;i<size;i++)
	{
		if(hash::l[i]!=0)
		{
			delete hash::l[i];
			hash::l[i] = 0;
		}
	}
}

void hash::Show()
{
	for(int i=0;i<size;i++)
	{
		if(hash::l[i]!=0)
			if(hash::l[i]->flag)
				printf("%s\n",hash::l[i]->passport);
	}
}

hash::hash()
{
	for(int i=0;i<size;i++)
	{
		hash::l[i] = 0;
		//hash::l[i]->flag=false;
		//l[i] = new Logers();
	}
}

hash::~hash()
{
}
проблема в том, что при добавлении в хэш (это сырой вариант, не критиковат хэш-таблицу) все нормально, т.е. показывает только так сказать номер паспорта, а вот, когда я хочу вывести данные, только паспорт, то программа выдает мне и номер паспорта и инициалы человека, в контрольных значениях там в переменной passport как раз это и находится. т.е. номер паспорта и инициалы. а если раскрыть, то показывает только номер паспорта. Подскажите пожалуйста, как с этим бороться? Спасибо заранее за ответы и подсказки!
Olejik вне форума Ответить с цитированием
Старый 28.01.2013, 23:01   #2
Arishk@
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 47
По умолчанию

Чтобы это вопрос не казался нерешенным, размер буфера (куда копируют строку) должен быть больше копируемой строки. Т.е у hash::l[tkey]->passport размер должен быть больше чем у passport.
Arishk@ вне форума Ответить с цитированием
Старый 29.01.2013, 07:31   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

терминальный нуль не забываем то.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.01.2013, 08:59   #4
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

я терминальный нуль делал, т.е. через for копировал посимвольно и как выходил из цикла - ставил еще по индексу i '\0', все раво не помогало
а вот с увеличением массива все получилось, сасибо огромное, на будущее запомню
Olejik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как исправить ошибку invalid conversion from const char* to char Ника К Помощь студентам 5 01.06.2012 00:13
'unsigned char [512]' в 'const char *' frommars Visual C++ 8 02.07.2011 13:37
Проблема с программой. Нельзя преобразовать тип set of char к char Lasso Помощь студентам 5 07.06.2011 12:03
преобразование типов char-const char student101 Помощь студентам 8 01.12.2010 20:45
Есть таблица - В ней три поля int, char, char нужно чтобы данные заносились в таблицу Mysql Muahahaha PHP 8 27.03.2008 11:17