массивы — C ++ stringstream в char * выделение памяти преобразования

Может кто-нибудь объяснить, как работает и работает следующий код не вылетать приложение?

int main() {
char *tempStr = new char[5];
tempStr[0] = '\0';
string stemp = "helloworld";
stringstream sstream;
sstream.str(stemp);
cout << "len before = " << strlen(tempStr);
sstream >> tempStr;
cout << "len after = " << strlen(tempStr) << endl;
cout << tempStr << endl;
delete[] tempStr;
return 1;
}

Я получаю вывод как

len before = 0
len after = 10
helloworld
  1. Сделал stringstream выделить память для дополнительных символов в указателе символа?
  2. Также хочу знать, как правильно копировать данные из stringstream в массив char *, не превышая объем памяти, выделенной для char*?

0

Решение

Выделил ли stringstream память для дополнительных символов в указателе символа?

Нет. Ваш код вызывает неопределенное поведение.

Также хотите узнать правильный способ копирования данных из stringstream в массив char *, не превышая объем памяти, выделенный для char *?

Это не очень хорошая идея, чтобы читать в char*, использование std::string читать ввод из потока. Но тогда, если вы все еще хотите знать ради знаний, используйте std::istream::read().

if ( sstream.read(tempStr, 5 ) )
{
//read succeeded
}

Кстати, вы можете объединить эти две строки:

stringstream sstream;
sstream.str(stemp);

в один:

stringstream sstream(stemp);

или просто так:

stringstream sstream("helloworld"); //no need of stemp!

Надеюсь, это поможет.

3

Другие решения

  1. Нет. Вы перезаписали память, вызвав неопределенное поведение, но ничего очевидного не произошло, поэтому ошибка осталась незамеченной. Не требуется, чтобы выполнение чего-то подобного приводило к возникновению каких-либо видимых человеком ошибок или специальных действий, таким образом, формулировка неопределенное поведение.
  2. Вам придется делать это по частям и перераспределять char массив, если ему не хватает места. В C ++ нет никакого смысла делать это вручную. Просто используйте std::string и будет сделано.
1

По вопросам рекламы [email protected]