2014-11-21 2 views
-2

У меня есть следующий код, по какой-то причине, когда я пытаюсь использовать for loop объявить string attribs от string wholecommand, attribs.length() возвращает 0 иC++ строка в цикл делает длину 0

Когда я попробовать:

cout<<attribs;

Он ничего не выводит.

for(int q=0;q<wholecommand.length();q++){ 
    cout<<atrribs[q]; 
} 

Код, приведенный выше, является единственным способом получить выход. Что не так с моим кодом и как я могу получить его для вывода данных без использования цикла for?

#include<iostream> 
#include<string> 
using namespace std; 

int main(){ 
    string wholecommand="apple"; 
    string atrribs; 
    for(int a=0;a<wholecommand.length();a++){ 
     atrribs[a]= wholecommand[a];   
    }            

    cout<<"Content of Wholecommand: "<<wholecommand<<endl; //returns apple 
    cout<<"Length of Wholecommand: "<<wholecommand.length()<<endl; //returns 5 

    cout<<"Content of attributes: "<<atrribs<<endl; ////////contains nothing 
    cout<<"Length of attributes: "<<atrribs.length()<<endl; ////////returns 0 

    system("pause"); 
} 
+0

Почему бы просто не назначить? 'string attribs = wholecommand;'? – PaulMcKenzie

+0

Если вы хотите скопировать 'string wholecommand =" apple "' в 'string atrribs', тогда вы можете сделать это' string stribs = wholecommand; ' – Shravan40

ответ

2

Помещенный

atrribs.resize(wholecommand.length()); 

перед циклом for(), чтобы получить эту работу должным образом.
Вы не можете назначать значения через индексы std::string, где целевая строка не была изменена в соответствии с ними.

Хотя сомнительно, какова цель вашего образца кода, как есть вообще? Вы можете просто добиться того же с

atrribs = wholecommand; 

без этого for() цикла.

+0

Works Great !!! И для вашего вопроса: мне нужен способ отделить атрибуты от командной строки для работы в cmd-каналах, это часть кода, который не работал. Спасибо alot – police123

1

атрибуты построены как строка длины 0; это то, что делает ctor по умолчанию. Естественно, когда вы печатаете строку длиной 0, ничего не появляется. (Даже если вы столкнулись с проблемой обращения к элементам с индексами за этот размер.)

Чтобы заставить его вести себя, убедитесь, что он достаточно длинный: либо установите его равным чему-то достаточно большому (attrib = wholeCommand - переделано!); или изменить его размер; или назовите его с помощью ctor, чтобы сделать его достаточно большим (string attrib (5, 'x'); // gives it 5 copies of x).

И как Павел указывает выше: вы может просто сказать string attrib = wholeCommand; и покончить с этим.

0

Вы можете сделать следующее:

string atrribs(wholecommand.length(), 0); 

От version six строкового конструктора, эта строка конструктор принимает в качестве первого аргумента число последовательных символов для заполнения и в качестве второго аргумента, какие символы для заполнения. В этом примере atrribs заполняется нулевым символом (0) пять раз подряд. Я мог бы использовать любой символ в этом примере.

+0

Hiya, это вполне может решить проблему ... но было бы хорошо, если бы вы могли * отредактировать свой ответ * и дать небольшое объяснение о том, как и почему оно работает :) Не забывайте, что есть кучи новички на переполнение стека, и они могли бы узнать кое-что из вашего опыта - для вас очевидно, что это не так. –

0

В первом ответе на этот вопрос в качестве решения был предложен resize().

Учитывая шаблон кода, предполагая, что это именно то, что вы действительно хотите сделать, resize() добавляет немного работы впустую. Вы переписываете каждую позицию в атрибутах. В этом случае работа, выполняемая изменением размера при расширении строки и построении элементов по умолчанию, бесполезна.

attribs.reserve() может быть лучше. Конечно, вы не можете использовать «[a] =».

Смежные вопросы