Вывод пустой строки в C++
Почему в коде на С++
#include <iostream>
int main(){
std::string E;
E[0] = 'a';
std::cout << E[0];
std::cout << E;
}
вывод строки E пустой, хотя строка не должна быть пустой после присвоения значения первому элементу строки? И где найти информацию по этому поводу?
Ответы (3 шт):
Запустим такой код:
string E;
cout << E.size() << endl;
и увидим вывод - 0. Т.е. нет никаких элементов строки вовсе, и запись любого элемента пустой строки есть по сути выход за границы выделенной памяти и UB.
Как именно отреагирует на ваше самовольство программа - зависит от конкретного компилятора, реализации string, уровня оптимизации etc etc - на то это поведение и undefined...
Можно просто присвоить E = 'a';, можно E += 'a'; - словом, по-разному, но в рамках стандарта :)
У вас, как уже выше отметили, отсутствует инициализация строки. Поэтому на момент вызова она пуста. Цитирую сайт https://metanit.com/cpp/tutorial/2.16.php. Для инициализации строк можно использовать различные способы:
#include <string>
#include <iostream>
int main()
{
std::string s1; //пустая строка
std::string s2 = "hello"; //hello
std::string s3("welcome"); //welcome
std::string s4(5, 'h'); //hhhhh
std::string s5 = s2; //hello
std::cout << s1 << "\n";
std::cout << s2 << "\n";
std::cout << s3 << "\n";
std::cout << s4 << "\n";
std::cout << s5 << "\n";
return 0;
}
Изменение строки по индексу с помощью [] приводит к неопределённому поведению. Этот оператор предназначен для быстрой обработки строк. Если программист знает, что хочет.
А если не уверен, то надо использовать другую функцию at, которая следит за неправильным доступом к строке и вызовет исключение.
#include <iostream>
int main(){
try {
std::string E;
E.at(0) = 'a';
std::cout << E.at(0);
std::cout << E; }
catch(std::exception const & ex){
std::cerr<<"exception : " << ex.what()<<std::endl;
}
}
проверяем :
exception : basic_string::at: __n (which is 0) >= this->size() (which is 0)
Исключение : аргумент индекса равен нулю, который больше или равен размеру строки, которая равняется нулю.
Чтобы добавить буквы к строке надо использовать другие функции : например оператор +=
E += 'a' ;
Почему у вас пустая строка - это неопределённое поведение. Зависит от реализации компилятора и случая.