Копировать длину символов из массива в std :: string

Я пытаюсь скопировать 5 символов из массива символов в std::string

char name[] = "Sally Magee";
std::string first;
copy(name, name + 5, first.begin()); //from #include <algorithm>
std::cout << first.c_str();

Однако я получаю строку плюс целую кучу непечатных символов, которые мне не нужны. Есть идеи? Благодарю.

2

Решение

Просто делать

char name[] = "Sally Magee";
std::string first(name, name + 5);
std::cout << first << std::endl;

увидеть std :: string constructor ссылка на сайт

8

Другие решения

Что за std::copy Алгоритм состоит в том, чтобы копировать один элемент источника за другим и продвигать конечный итератор после каждого элемента.

Это предполагает, что

  • либо размер целевого контейнера был установлен достаточно большим, чтобы вместить все элементы, которые вы копируете,
  • или вы используете тип итератора, который увеличивает размер контейнера назначения каждый раз, когда вы делаете ему назначение.

Поэтому, если вы хотите использовать std::copy В алгоритме есть два способа решения этой проблемы:

  1. Измените размер строки перед копированием:

    #include <iostream>
    #include <string>
    #include <algorithm>
    
    int main()
    {
    char source[] = "hello world";
    
    std::string dest;
    dest.resize(5);
    std::copy(source,source+5,begin(dest));
    
    std::cout << dest << std::endl;
    
    return 0;
    }
    
  2. Использование итератора с обратной вставкой вместо стандартного:

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <iterator>
    
    int main()
    {
    char source[] = "hello world";
    
    std::string dest;
    std::copy(source,source+5,std::back_inserter(dest));
    
    std::cout << dest << std::endl;
    
    return 0;
    }
    

Однако, как отмечают другие, если цель состоит в том, чтобы просто скопировать первые 5 символов в строку во время инициализации, использование соответствующего конструктора, безусловно, является лучшим вариантом:

std::string dest(source,source+5);
0

По вопросам рекламы [email protected]