LINUX.ORG.RU

std::string in C++


0

0

Почему так происходит?
Как поместить в st[5] символ, чтобы при этом он появился в выводе cout<<st<<endl? На данный момент даже size() говорит что размер 5
-----code-----
#include <string>
#include <iostream>
using namespace std;
int main(){

std::string st;
st = "Hello";

cout << st <<endl;
st[0] = '1';
st[1] = '2';
st[2] = '3';
st[3] = '4';
st[4] = '5';
st[5] = '6';

cout << st <<endl;
cout << st.c_str() <<endl;
cout << st.size() <<endl;
}


anonymous

... cout << st <<endl; st += " "; st[0] = '1'; ...

В оригинале ты пишешь в неинициализированную память: st[5] = '6';

anonymous
()
Ответ на: комментарий от anonymous

И как тогда по нормальному работать? Представляешь если я в цикле запущу посимвольно перенести из одной строки в другую и размер последней окажется меньше. Постоянно размер проверять и если меньше добавлять пробел? Неужели нету более удобного способа?

anonymous
()
Ответ на: комментарий от anonymous

И как тогда я могу уменьшить строку? Например там была строка "1234567890", я помещаю туда "0000" и в итоге получается "0000567890"?

anonymous
()
Ответ на: комментарий от anonymous

>И как тогда я могу уменьшить строку? Например там была строка "1234567890", я помещаю туда "0000" и в итоге получается "0000567890"?

st="0000"; - не?

Тут вопрос чего ты хочешь - реально уменьшить размер памяти занятой - тут только буфер переаллокировать. А если просто не хочешь чтобы видны были символы дальше, а размер был такой же - то просто

st[0]='0';

st[1]='0';

st[2]='0';

st[3]='0';

st[4]='\0';

imp ★★
()
Ответ на: комментарий от placement_new

>Страно но работает

Нифига не работает. c_str() возвратит последовательность символов до нуль-символа, а st - всю последовательность. size() тоже будет прежним.

//fixway подтверждает

anonymous
()
Ответ на: комментарий от anonymous

> - st = "Hello";
> + st = "Hello!";

+1

> если я в цикле запущу посимвольно перенести из одной строки в другую и
> размер последней окажется меньше. Постоянно размер проверять и если
> меньше добавлять пробел?

string s1 = "";
stirng s2 = "s2 string";
for (int i = 0; i < s2.length(); i++)
  s1 += s2[i];

> И как тогда я могу уменьшить строку?

Только не так: s[5]='\0';
Это C++, а не C, и длина string-a - есть std::string::length(), а для ее изменения есть методы:

void std::string::resize(size_t n)
void std::string::resize(size_t n, char c)

Или Вы точно знаете, как организован класс string изнутри???
Проделайте следующий эксперимент:

string s;
s = "123456789";
s[3] = '\0';
cout << s << " <- vot suda sleduet obratit' vnimanie:)" << endl;
cout << "size: " << s.size() << endl
<< "length: " << s.length() << endl
<< "capacity: " << s.capacity() << endl
<< "max_size: " << s.max_size() << endl;

> Например там была строка "1234567890", я помещаю туда "0000" и
> в итоге получается "0000567890"?

s = "0000";

или в цикле:

s="";
for (int i = 0; i < 4; i++)
  s += '0';

или так:

samson ★★
()
Ответ на: комментарий от samson

s = string("0000");
так память должна быть выделена заново. Если строка была большой, то после:
s = "0000";
изменится ее длина, но s.capacity() окажется больше.

samson ★★
()
Ответ на: комментарий от placement_new

#include <iostream>
#include <string>

int main() {

    using namespace std;

    string st("123456");
    cout << st << endl;
    cout << st.c_str() << endl;
    cout << st.size() << endl;

    cout << endl;

    st[3] = '\0';

    cout << st << endl;
    cout << st.c_str() << endl;
    cout << st.size() << endl;

}

результат:
123456
123456
6

12356
123
6


P.S. gcc version 4.2.1

anonymous
()
Ответ на: комментарий от anonymous

Re^2: std::string in C++

> И как тогда по нормальному работать? Представляешь если я в цикле запущу посимвольно перенести из одной строки в другую и размер последней окажется меньше. Постоянно размер проверять и если меньше добавлять пробел? Неужели нету более удобного способа?

s += symbol;

gaa ★★
()
Ответ на: комментарий от anonymous

Re^2: std::string in C++

> И как тогда по нормальному работать? Представляешь если я в цикле запущу посимвольно перенести из одной строки в другую и размер последней окажется меньше. Постоянно размер проверять и если меньше добавлять пробел? Неужели нету более удобного способа?

А вообще переносить из строки в строку надо тупым присваиванием.

gaa ★★
()

У многих отписавшихся наблюдается C-string головного мозга

quarck
()
Ответ на: комментарий от anonymous

> результат:
> 123456

> 123456

> 6

>

> 12356

> 123

> 6


так и должно быть. string::c_str() возвращает char* - C-string. А конец C-строки - это и есть '\0'.

samson ★★
()
Ответ на: комментарий от samson

>так и должно быть.

Я и не возражаю, просто отвечал placement_new, у которого работало не так =)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.