Вывод пустой строки в C++

Почему в коде на С++

#include <iostream>
int main(){
    std::string E;
    E[0] = 'a';
    std::cout << E[0];
    std::cout << E;
}

вывод строки E пустой, хотя строка не должна быть пустой после присвоения значения первому элементу строки? И где найти информацию по этому поводу?


Ответы (3 шт):

Автор решения: Harry

Запустим такой код:

string E;
cout << E.size() << endl;

и увидим вывод - 0. Т.е. нет никаких элементов строки вовсе, и запись любого элемента пустой строки есть по сути выход за границы выделенной памяти и UB.

Как именно отреагирует на ваше самовольство программа - зависит от конкретного компилятора, реализации string, уровня оптимизации etc etc - на то это поведение и undefined...

Можно просто присвоить E = 'a';, можно E += 'a'; - словом, по-разному, но в рамках стандарта :)

→ Ссылка
Автор решения: Kinzheyev Madi

У вас, как уже выше отметили, отсутствует инициализация строки. Поэтому на момент вызова она пуста. Цитирую сайт 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;
}
→ Ссылка
Автор решения: AlexGlebe

Изменение строки по индексу с помощью [] приводит к неопределённому поведению. Этот оператор предназначен для быстрой обработки строк. Если программист знает, что хочет.

А если не уверен, то надо использовать другую функцию 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' ;

Почему у вас пустая строка - это неопределённое поведение. Зависит от реализации компилятора и случая.

→ Ссылка