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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2017, 13:47   #1
DimitryLutsenko
Новичок
Джуниор
 
Регистрация: 21.06.2017
Сообщений: 5
По умолчанию "Телефонный справочник"

Добрый день, уважаемые форумчане!

Я реализую программу "Телефонный справочник".

Проблема возникает при считывании данных с консоли в поля структуры.
Хотелось бы, чтобы данные для каждого поля считывались как цельная строка, которая в дальнейшем приводилась к типу char[] / char*

Заранее благодарю за помощь.

Код:

#include "stdio.h"
#include "iostream"
#include "string.h"
using namespace std;

struct Persone {

   char *firstname;
   char *lastname;
   char *callnumber;
   Persone *next, *head;
};

void Delete (Persone *Pers) {

   if (Pers -> head == NULL) {

      cout << "Стек пуст" << endl;
   return;
}

if (Pers -> head != NULL) {//Если ввести в цикл while, то это будет реализацией очистки списка
//Данный алгоритм я реализовал в методе Clear_List();
Persone *show_delete_element;//напоследок сохраним удаляемый
show_delete_element = Pers->head;
//элемент для показа в консоли

Persone *Temp_stack = Pers -> head -> next; // сохраняем ссылку на следующий элемент
cout << "Запись о " << show_delete_element -> firstname << " " <<show_delete_element ->lastname << " " << show_delete_element ->callnumber << " удалена" << endl;
delete Pers -> head;


Pers -> head = Temp_stack;//голова стека указывает на следующий элемент
cout << "Элемент удален" << endl;

return;
}

}

void addElem (char *firstname, char *lastname, char *callnumber, Persone *&pers) {
Persone *temp = new Persone;

temp -> firstname = firstname;
temp -> lastname = lastname;
temp -> callnumber = callnumber;
//реализация стека
temp -> next = pers -> head;
pers -> head = temp;
}

char *Get_Data (string &sstr) {

char* cstr2 = new char[sstr.length()];
strcpy(cstr2, sstr.c_str());
for (int i = 0; i < sstr.length(); i++) cout << cstr2[i];

return cstr2;
}

void Show (Persone *per) {

Persone *List = per -> head;

while (List != NULL) {

cout << endl << "=========================================" << endl;
cout << "Имя: " << List -> firstname << endl;
cout << "Фамилия: " << List -> lastname << endl;
cout << "Номер телефона: " << List -> callnumber << endl;
cout << endl << "=========================================" << endl;
List = List -> next;
}
if (per->head == NULL) {

cout << "Справочник пуст, отображать нечего" << endl;
}

}


void Input (Persone *&pers) {

string f_n, l_n, c_n;

cout << "name: ";
scanf("%25s", f_n);
cout << endl;

cout << "lastname: ";
scanf("%25s", l_n);
cout << endl;

cout << "callnumber: ";
scanf("%s25s", c_n);
cout << endl;

addElem (Get_Data (f_n), Get_Data (l_n), Get_Data (c_n), pers);
cout << "Запись сделана" << endl;

}

void Menu () {

cout << endl << "Введите команду:" << endl;
cout << "1 - Внести значение" << endl;
cout << "2 - Вывести список" << endl;
cout << "3 - Поиск" << endl;
cout << "4 - Загрузить из файла" << endl;
cout << "5 - Сохранить в файл" << endl;
cout << "6 - Очистить экран" << endl;
cout << "7 - Выход" << endl;
cout << "Команда: ";

}

void ClearList (Persone *per) {

while (per -> head != NULL) {

Persone *temp = per -> head -> next;
delete per->head;
per->head = temp;
}

}


int main () {

setlocale (LC_ALL, "russian");
//system ("color f2");
Persone *pers = new Persone;
pers->head = NULL;

cout << "Команда " << endl;
//Input (pers); не работает

addElem ("Igor", "Petrov", "119922", pers);

Show (pers);
cout << endl;
Delete (pers);

Show (pers);

ClearList (pers);

system ("pause");
return 0;
}
DimitryLutsenko вне форума Ответить с цитированием
Старый 22.06.2017, 13:51   #2
DimitryLutsenko
Новичок
Джуниор
 
Регистрация: 21.06.2017
Сообщений: 5
По умолчанию

Ошибка при выполнении: Unhandled exception at 0x522aad54 (msvcp100d.dll) in PhoneBook.exe: 0xC0000005: Access violation writing location 0x4f525737.
DimitryLutsenko вне форума Ответить с цитированием
Старый 22.06.2017, 14:02   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

%s требует параметра в типа const char*, вы же передаете std::string
waleri вне форума Ответить с цитированием
Старый 22.06.2017, 14:10   #4
DimitryLutsenko
Новичок
Джуниор
 
Регистрация: 21.06.2017
Сообщений: 5
По умолчанию

Спасибо большое, не подумал малость. Теперь все работает.

Код:

#include "string"

//...............


void Input (Persone *&pers) {

string f_n, l_n, c_n;

cout << "name:";
getline(cin, f_n);
cout << endl;

cout << "lastname:";
getline(cin, l_n);
cout << endl;

cout << "callnumber:";
getline(cin, c_n);
cout << endl;

addElem (Get_Data (f_n), Get_Data (l_n), Get_Data (c_n), pers);
cout << "Запись сделана" << endl;

}
DimitryLutsenko вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
курсовая "Телефонный справочник" NewLamer&Programer Общие вопросы C/C++ 20 05.05.2013 13:04