Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65

Класс "Телефонная станция". Массив символов и массив строк - в чем разница?

19.10.2014, 14:07. Показов 1603. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

Не могу исправить в программе пункт корректировки. Весь проект прикрепляю к сообщению.

https://www.cyberforum.ru/atta... 1413713458


В общем, проблема именно в файле station.cpp :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* ==================================================
Член функция для корректировки член-данных
================================================== */
 
 
void TelephoneStation::correction() {
    int i;
    int choise;
    cout << "Введите номер станции:";
    cin >> i;
 
    //Проверка, если введенный номер станции существует
    if (i > comparison) {
        cout << "Нет станции с таким номером!" << endl;
        return;
    }
 
    do {
 
        //очистка экрана и вывод вспомогательного меню
        system("cls");
        cout << "Выберете член-данные которые следует откорректировать:" << endl;
        cout << "1: Адрес станции" << endl;
        cout << "2: Имя компании владелицы" << endl;
        cout << "3: Требуется корректировка по каждому абоненту" << endl;
        cout << "0: Выход из режима корректировки" << endl;
        cout << "Введите Ваш выбор:";
        cin >> choise;
 
        /*корректировка данных будет происходить посредством
        повторного ввода член-данных, перезаписи*/
 
        switch (choise) {
        case 0:
            return;
 
        case 1:
            cout << "Введите новый адрес станции:";
            station_adress[i] = new char[20];
            cin >> station_adress[i];
            cout << "Записанно новое значение adress_station: " << station_adress[i] << endl;
            break;
 
        case 2:
            cout << "Введите новое имя компании владелицы:";
            station_adress[i] = new char[20];
            cin >> owner_comp_name[i];
            cout << "Записано новое значение имени компании владелицы: " << owner_comp_name[i] << endl;
            break;
 
        case 3:
            aSubs.correction(i);
            break;
 
        default:
            cout << "Неверный пункт. Проверьте правильность ввода данных" << endl;
        }
 
    } while (choise != 0);
}
По ходу выполнения программы, он записывает вроде в переменную новое значение. Но когда я выхожу из корректировки данных, то при выводе на экран он получается не сохраняет новое введенное значение.

В чем может быть проблема?

Да и еще там есть такой недочет... например если я изменяю Адрес станции, то потом вылетает с ошибкой при попытке редактирования

C++
1
2
3
4
5
6
case 2:
            cout << "Введите новое имя компании владелицы:";
            station_adress[i] = new char[20];
            cin >> owner_comp_name[i];
            cout << "Записано новое значение имени компании владелицы: " << owner_comp_name[i] << endl;
            break;
Вот этого вот.

Помогите решить эту проблему. Только это осталось, все остальное работает.
Вложения
Тип файла: zip StationRemade.zip (2.05 Мб, 14 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2014, 14:07
Ответы с готовыми решениями:

Напишите метод, который будет принимать массив строк в качестве параметра и возвращать массив строк с более чем 4 гласны
Помогите с задачей на языке Java

Композиция классов. Класс "Абонентская телефонная станция"
Описать класс, содержащий коллекцию сущностей, сохранившихся в виде массива. В качестве сущностей взять экземпляры номер счета адрес ...

Как перевести массив символов в массив строк и обратно?
Помогите пожалуйста. Как перевести массив символов в массив строк и обратно?

11
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 55
19.10.2014, 14:13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class TelephoneStation {
 
private:
    char *station_adress[20];
    AboutSubscribers aSubs; //список абонентов
    char *owner_comp_name[20];
    int comparison;
 
public:
    void keyboard_initialization();
    void write_to_file();
    void file_initialization();
    void print_out();
    void correction();
 
    int data_comparison();
 
    void print_name_by_phone_number();
    void print_phone_number_by_name();
    void print_name_by_adress();
 
 
};
Либо я туплю... либо ты сначала создаешь указатель на char длиной в 20 символов. А потом тут:
C++
1
station_adress[i] = new char[20];
например в 5й символ из этих 20, ты суёшь ещё 20... или я что-то не так понимаю
0
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
19.10.2014, 14:16  [ТС]
Изначально я так скинул, потом изменил.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 case 1:
            cout << "Введите новый адрес станции:";
            //station_adress[i] = new char[20];
            cin >> station_adress[20];
            cout << "Записанно новое значение adress_station: " << station_adress[20] << endl;
            break;
 
        case 2:
            cout << "Введите новое имя компании владелицы:";
            //station_adress[i] = new char[20];
            cin >> owner_comp_name[20];
            cout << "Записано новое значение имени компании владелицы: " << owner_comp_name[20] << endl;
            break;
Да и в проекте это вроде как закомментированно.

Вот например на скрине видно, что он записывает туда значение. А например дальше, в переменную owner_comp_name[20] он ничего не запишет и вылетит с ошибкой.

Или же запишет, но потом при выходе из корректировки эти переменные не сохранятся

https://www.cyberforum.ru/atta... 1413713968
Миниатюры
Класс "Телефонная станция". Массив символов и массив строк - в чем разница?  
0
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 55
19.10.2014, 14:20
ты серьёзно?
C++
1
2
        cout << "Нажмите любую клавишу для продолжения..." << endl;
        _getch();
эммм, мне кажется лучше
C++
1
system("pause");
Добавлено через 48 секунд
MessageToBears, просто открыл проект класса, в проекте не заметил

Добавлено через 2 минуты
MessageToBears, конечно не уверен, но скорее всего измени:
C++
1
char *station_adress[20]
на
C++
1
char station_adress[20]
или уж на простой указатель
C++
1
char *station_adress
но тогда создавай его динамический
0
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
19.10.2014, 14:25  [ТС]
Если я изменю
C++
1
char *station_adress[20]
То весь проект полетит

Добавлено через 1 минуту
C++
1
system("pause");
Заменил я даже не заметил
0
 Аватар для p_r_a_g_m_a
112 / 64 / 23
Регистрация: 08.03.2012
Сообщений: 211
19.10.2014, 14:26
Лучший ответ Сообщение было отмечено MessageToBears как решение

Решение

MessageToBears, проблема с индексами (int i = 0;):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void TelephoneStation::print_out() {
    int i;
    cout.setf(ios::left, ios::adjustfield); //форматированный вывод данных, выравнивание по правой границе
 
    for (i = 0; i < comparison; i++) {
 
        cout << "Номер станции" << i << endl;
        cout << "------------------" << endl;
        aSubs.print_out(i);
        cout << "------------------" << endl;
        cout << "Адрес станции" << station_adress[i] << endl;
        cout << "------------------" << endl;
        cout << "Имя компании владелицы" << owner_comp_name[i] << endl;
 
    }
}
Если указать номер станции при вводе данных с клавиатуры - 1, то будет вот такой косяк, так как в цикле вывода на экран данных отсчет начинается с нуля.

Добавлено через 31 секунду
Цитата Сообщение от trystyle Посмотреть сообщение
char station_adress[20]
Это массив строк а не символов...
1
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 55
19.10.2014, 14:27
MessageToBears,
ну смотри...
ты записываешь так:
C++
1
cin >> station_adress[20];
а при выводе хочешь получить так:
C++
1
2
3
4
        cout << "------------------" << endl;
        cout << "Адрес станции" << station_adress[i] << endl;
        cout << "------------------" << endl;
        cout << "Имя компании владелицы" << owner_comp_name[i] << endl;
косяяяяк..

А что бы быть точнее, что бы до конца разобраться в проекте твоём, засунь в архив ещё файлы студии, которые запускают проект полностью, а не только cpp + h (ибо так будет быстрее)
0
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
19.10.2014, 14:32  [ТС]
А что бы быть точнее, что бы до конца разобраться в проекте твоём, засунь в архив ещё файлы студии, которые запускают проект полностью, а не только cpp + h (ибо так будет быстрее)
Перезакачай файл, я туда всунул весь проект VS.


Так а как записать в
C++
1
cin >> station_adress[i];
не выделяя при этом памяти?
C++
1
station_adress[i] = new char[20];
Капец как стыдно
0
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 55
19.10.2014, 14:44
MessageToBears, как я понял тебе получается нужен массив строк по 20 эл-тов?

Добавлено через 2 минуты
MessageToBears, блин, только вышел с компании Если решения не будет, то вечером залезу в твой проект.
0
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
19.10.2014, 14:45  [ТС]
как я понял тебе получается нужен массив строк по 20 эл-тов?
Указатель на массив из 20 элементов

Да у меня времени вагон, спасибо. Просто реально я уже второй-третий раз переписываю это все, чтобы не нарушить логику, все было написано красиво и работало как часики, а вот не получается =(
0
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 55
19.10.2014, 14:53
MessageToBears, вообще я б на твоём месте использовал бы std::string для упращения ситуации..
0
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
19.10.2014, 15:11  [ТС]
А вот класс AboutSubscribers и корректировка работает без проблем.

При чем, там такая же логика:

1.
C++
1
2
private:
    char *subs_name[20];
2. aboutsubscribers.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
case 1:
            cout << "Введите новое имя абонента:";
            subs_name[i] = new char[20];
            cin >> subs_name[i];
            break;
 
        case 2:
            cout << "Введите новый номер телефона:";
            subs_phone_number[i] = new char[20];
            cin >> subs_phone_number[i];
            break;
 
        case 3:
            cout << "Введите новую дату установки:";
            install_date[i] = new char[20];
            cin >> install_date[i];
            break;
 
        case 4:
            cout << "Введите новый адрес абонента:";
            subs_adress[i] = new char[20];
            cin >> subs_adress[i];
            break;
И все работает

кстати, при ошибке меня кидает он в istream

C++
1
*_Str++ = _Traits::to_char_type(_Meta); // add it to string
Добавлено через 15 минут
Все, нашел проблему вроде.

Проблема заключалась с индексами. Сейчас исправлю еще раз проверю и опишу подробнее для остальных, если кому интересно будет.

Цитата Сообщение от p_r_a_g_m_a Посмотреть сообщение
Проблема с индексами (int i = 0
Прагма, спасибо

В общем, при корректировке я обращался к станции с индексом 1, а нужно было с индексом 0.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.10.2014, 15:11
Помогаю со студенческими работами здесь

Прочитать из файла массив строк символов. Отсортировать массив по алфавиту (методом выбора). Результат вывести на экран и записать в файл
На языке С прочитать из файла массив строк символов. Отсортировать массив по алфавиту (методом выбора). Результат вывести на экран и...

Преобразовать массив строк в массив символов
Как массив строк, содержащий числа Фибоначчи, преобразовать в массив символов, чтобы каждый символ являлся одним из чисел Фибоначчи?

Разбить массив строк на массив символов
У меня вот такая проблема. Я хочу строку разбить на массив слов. Потом этот массив слов прогнать через цикл что бы каждое слово разбить на...

Телефонная станция
Помогите решить задачу.Сессия на носу) На междугородной телефонной станции картотека абонентов, содержащая сведения о телефонах и их...

Международная телефонная станция
Привет Всем. Вот нам задали задачку, а я не понимаю как ее решить. На международной телефонной станции картотека абонентов, содержащая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru