2013-07-01 3 views
2

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

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

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

ответ

8

Вобще

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

см std::string constructor ссылку

+0

спасибо, будет согласитесь, когда SO позволяет мне. – user2537688

+0

@ пользователь2537688 добро пожаловать. – billz

+0

Альтернативно: 'std :: string first (name, 5);' –

0

Что алгоритм 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); 
Смежные вопросы