C ++ std :: string проблема с использованием VC10 - PullRequest
0 голосов
/ 08 февраля 2011

Я использую C ++, Visual Studio 2010 Premium на Windows 7, и в моем приложении у меня есть переменная std :: string, которая завершается неудачно при добавлении :( ...

Ситуация такова, что строковая переменная содержит огромное количество символов, добавляемых в разное время, впервые я добавляю, например, 7609 байт, второй раз 8184 и, наконец, 1463, что-то вроде

std::string str; 
long bytesRead; 
char buffer[BUFFER_SIZE];

do { 
   bytesRead = ReadChars(buffer, BUFFER_SIZE -1); 
   buffer[bytesRead] = 0; // I omitted this line before, but it was in the original code
   if (bytesRead > 0)    
       str += buffer; // I'm already taking care of the char 0 at the end :)
} while (bytesRead > 0); 

, поэтому каждый раз, когда я вызываю + = (или добавляю, тот же результат), он добавляет дополнительную строку (последние 7 или 8 символов из исходного буфера), например

оригинальный буфер заканчивается "строка добавлена"

после добавления str заканчивается "строка присоединена добавлена"

Кто-нибудь знает, если это известная проблема? или, может быть, если я что-то пропустил

Я включил это в комментарии внизу, но, может быть, лучше, если бы я тоже добавил это сюда

ReadChars : прочитать последовательность символов и вернуть количество прочитанных байтов

bytesRead : если чтение, оно> 0 ... так что все в порядке, если буфер считается ASCIIZ,

Я пытался с функцией добавления, но получить то же поведение (например, str.append (буфер);)

С уважением Jorge

Ответы [ 3 ]

5 голосов
/ 08 февраля 2011

Является ли этот фрагмент вашим настоящим кодом? Что вы имеете в виду под "заботой о символе 0"?

do { 
   bytesRead = ReadChars(buffer, BUFFER_SIZE); 
   if (bytesRead > 0)
       str += buffer; // I'm already taking care of the char 0 at the end :)
} while (bytesRead > 0);

В вашем примере вы всегда добавляете весь буфер к строке, фактически игнорируя bytesRead. Так что std::string будет считывать с buffer до тех пор, пока не будет найден байт NULL - это может вызвать переполнение и, конечно, не то, что вам нужно.

Вы должны указать, сколько байтов из buffer нужно добавить. Вместо этого попробуйте следующее:

do { 
   bytesRead = ReadChars(buffer, BUFFER_SIZE); 
   if (bytesRead > 0)
       str.append(buffer, buffer + bytesRead);
} while (bytesRead > 0);
0 голосов
/ 08 февраля 2011

Без информации о ReadChars это выглядит точно как buffer не завершается нулем и std::string добавляет символ из буфера, пока не достигнет случайного 0 в памяти.

0 голосов
/ 08 февраля 2011

Вы сказали, что уже позаботились о "0" в конце ... Вы уверены, что не удаляли пробел в конце каждой строки, которую вы пытаетесь добавить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...