строка — как вы переносите текст в пробел в стек переполнения

Я пытаюсь сделать функцию переноса текста, которая будет получать строку и количество символов, которые нужно пересчитать перед переносом. Если возможно, я бы хотел, чтобы слова не обрезались, ища предыдущее место и оборачивая его.

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

string textWrap(string str, int chars) {
string end = "\n";

int charTotal = str.length();
while (charTotal>0) {
if (str.at(chars) == ' ') {
str.replace(chars, 1, end);
}
else {
str.replace(str.rfind(' ',chars), 1, end);
}
charTotal -= chars;
}
return str;
}

int main()
{
//function call
cout << textWrap("I want to wrap this text after about 15 characters please.", 15);
return 0;
}

0

Решение

использование станд :: строка :: на в сочетании с станд :: строка :: RFIND. Часть кода, которая заменяет пробел справа от locationго персонаж это:

std::string textWrap(std::string str, int location) {
// your other code
int n = str.rfind(' ', location);
if (n != std::string::npos) {
str.at(n) = '\n';
}
// your other code
return str;
}

int main() {
std::cout << textWrap("I want to wrap this text after about 15 characters please.", 15);
}

Выход:

Я хочу завернуть
этот текст после 15 символов, пожалуйста.

Повторите для остальной части строки.

1

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

Существует более простой способ, чем поиск пробелов самостоятельно:

Put the line into a `istringstream`.
Make an empty `ostringstream`.
Set the current line length to zero.
While you can read a word from the `istringstream` with `>>`
If placing the word in the `ostringstream` will overflow the line (current line
length + word.size() > max length)
Add an end of line `'\n'` to the `ostringstream`.
set the current line length to zero.
Add the word and a space to the `ostringstream`.
increase the current line length by the size of the word.
return the string constructed by the `ostringstream`

Есть одна ошибка, которую я оставляю там: работа с последним пробелом в конце строки.

1

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