![]() |
Проблема с cin.getline()
В некоторой части программы требуется ввести строку (включая пробелы), для чего я решил использовать cin.getline().
Код:
char *text; Если написать, к примеру, cin.getline(text,40); , т.е. ограничить строку до 40 символов включая символ перехода на след. строку, тогда никаких проблем нет. Но задача состоит как раз таки в том, чтобы через cin.getline() вывести строку, размер которой, так сказать, динамический. Я, конечно, подозреваю, что подобное невозможно без ограничения/декларации символьного массива, но все же - возможно ли решить такую проблему? |
Код:
char *text; //1 (2) new char() вернёт указатель на 1 (!) символ. Попытка записи туда более 1 символа приведёт к порче разметки памяти. basic_istream::getline считывает символы и складывает их в заранее выделенную память, поэтому на вход ему надо подсовывать столько памяти, во сколько уместится самая большая строка, которую хочешь прочитать. Размер строки можно потом узнать поиском нулевого символа '\0'. Доставшаяся `C++` строка char* по наследству от `C` не умеет сама менять свой размер. Вместо этого нужно выделять новую память, копировать туда новое содержимое строки и удалять старую память. Если тебе нужно такую строку, которая умеет менять свой размер, используй шаблон basic_string. Код:
#include <string> |
Цитата:
Цитата:
Цитата:
Код:
#include <iostream> |
pva,
Цитата:
Цитата:
Но интересно то, что через cin>>text; строка будет записываться до пробела/символа перевода строки. Собственно полный код: Код:
#include <iostream> В общем проблема возникла именно с вводом ФИО. Стоит оставить все в таком виде или все таки есть вариант преобразования string в char* ? |
Цитата:
char *string::c_str(); Код:
string text = "text"; |
Chilli, Прошу прощения, возможно я неправильно понял задачу. Так не пойдёт?
Код:
#include <iostream> |
Цитата:
Код:
string Ещё, как вариант, можно вынести отдельно текстовые ресурсы, тогда ещё и на разные языки переводить программу можно будет |
Время: 17:23. |
Время: 17:23.
© OSzone.net 2001-