std::string и std::initializer_list

203
29 марта 2018, 09:25

Есть невероятно простой код:

#include <iostream>
#include <string>
int main()
{
    const char* s1 = "A";
    const char* s2 = "B";
    std::string s{s1, s2};
    std::cout << s << std::endl;
}

Компилируется "на ура". Но вот при его выполнении начинаются странности. Я ожидаю получить переменной s строку "AB", но вместо этого получаю "A". Более того, если при создании строки я поменяю местами параметры, т.е. напишу

std::string s{s2, s1};

то приложение вообще падает. И это происходит на двух компиляторах - MinGW 7.3.0 x64 и MSVC2017.

Ошибка при выполнении второго варианта (MinGW):

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_M_create
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Ошибка, выдаваемая MSVC2017 маловразумительная.

Уважаемые гуру программирования! Объясните, пожалуйста, почему такое происходит? Вероятно, я делаю что-то неправильно, но что именно? Заранее спасибо за ответ.

Answer 1

У std::string нет конструктора, принимающего набор си-строк. А именно так ты и пытаешься сделать.

Если тебе нужно создать строку из двух символов, то:

char s1 = 'A';                                                              
char s2 = 'B';                                                              
std::string s{s1, s2}; 

Если тебе нужно создать новую строку из конкатенации двух строк, то что-то типа:

const char* s1 = "A";                                                       
const char* s2 = "B";                                                       
std::string s = std::string("A") + std::string("B"); 
Answer 2

Потому-что ты объявил 2 строки а как мы знаем на конце каждой строки есть терминирующий ноль \0 он появляется неявно поэтому стоит использовать конкатенацию строк

#include <iostream>
#include <string>
int main()
{
    const char* s1 = "A";
    const char* s2 = "B";
    std::string s = s1;
    s += s2;
    std::cout << s << std::endl;
}
READ ALSO
Вывод логов действий с файлами

Вывод логов действий с файлами

Где найти файл лога Win с информацией о, например, кол-ве удалённых папок или файлов? Ну, не само количество, а, допустим, просто инфу о том, какие...

208
Ошибка памяти или синтаксиса С++

Ошибка памяти или синтаксиса С++

Добрый вечерПишу код программы, которая должна иметь функции ввода и вывода массива типа структуры AEROFLOT

218