2016-02-27 2 views
0

У меня возникают некоторые проблемы прямо сейчас, пытаясь добавить массив символов в строку C++ после установки некоторых значений строки C++, и я не понимаю, почему. Мне было интересно, знает ли кто-нибудь о том, что происходит.Проблемы с добавлением строк в C++

Вот код, который я пытаюсь запустить:

string test = ""; 
test.resize(1000); 
char sample[10] = { "Hello!" }; 
test[0] = '1'; 
test[1] = '2'; 
test[2] = '3'; 
test[3] = '4'; 
test += sample; 

Запуск через отладчик, кажется, что test просто «1234», и «Hello» никогда не добавляется.

Заранее благодарен!

+0

Я не вижу вещи неправильно в вашей программе и данных. Вы уверены, что это образцы данных, которые вы пробовали? или у вас есть «\ 0» перед «Привет!». –

ответ

3

Добавлено, но после 1000 символов, которые у вас уже есть в строке (4 из них - 1234, а 996 - символы «\ 0»).

Функция изменения размера делает выделить 1000 символов для строкового объекта, но и устанавливает длину до 1000. Вот почему иногда, что вы хотите сделать вместо этого использовать reserve

Это нормально, что я хотел бы сделать:

string test = ""; 
test.reserve(1000); // length still 0, capacity: 1000 
char sample[10] = { "Hello!" }; 
test.push_back('1'); // length is 1 
test.push_back('2'); // length is 2 
test.push_back('3'); // length is 3 
test.push_back('4'); // length is 4 
test += sample; // length is now 10 

Или, если вы хотите сделать это по-своему:

string test = ""; 
test.resize(1000); // length is 1000 
char sample[10] = { "Hello!" }; 
test[0] = '1'; // length is 1000 
test[1] = '2'; // length is 1000 
test[2] = '3'; // length is 1000 
test[3] = '4'; // length is 1000 
test.resize(4); // length is now 4, but the internal buffer still has a capacity of 1000 characters 
test += sample; // length is now 10 
+2

Это было бы правильно, но есть _small_ детали, которые вы упустили. Не 996 пробелов, а 996 символов '' \ 0''. Который обрабатывается как ограничитель строк при печати. –

+0

Да, вы правы, я действительно понял, что за несколько секунд до того, как я увидел ваш комментарий, я обычно изменяю размерные объекты со вторым параметром, установленным в космос ('') – Jts

0

Я думаю, что проблема в том, когда вы сделали test.resize(1000) он добавил 1000нулевые символы ('\0') к строке. Отладчик, вероятно, видит нулевые символы как end-of-string. Таким образом, любой текст добавил после эти пустые символы не будут отображаться.

Say текст равен это ('_' = нулевой символ конец линии маркера):

test = "1234_______________Hello!"; 
      ^
      Debugger thinks text ends here 
Смежные вопросы