C ++ substr () проблемы, когда строка содержит специальные символы - PullRequest
0 голосов
/ 12 декабря 2010

Я пытаюсь разбить строку c ++ на несколько подстрок (NUM_LINES), каждая из которых имеет длину CHAR_PER_LINE.

 for(int i = 0; i < NUM_LINES; i++) {
 lines[i] = totalstring.substr(i*CHAR_PER_LINE,CHAR_PER_LINE);
 }

Работает нормально, если в строке нет специального символа.В противном случае substr () возвращает мне строку длиной не более CHAR_PER_LINE, но останавливается прямо перед специальным символом и выходит из цикла.

Любые подсказки?


ок, отредактировать1) Я определенно не достигаю конца своей строки.Если мой totalstring.length () равен 1000 и у меня есть специальный символ в первой строке (это первые символы строки CHAR_PER_LINE (30)), цикл завершается.

2) Специальные символы У меня возникли проблемыНапример, с 'ö' и '-' (длинный)

РЕДАКТИРОВАТЬ 2:

std::string text = "aaaabbbbccccdödd";
std::string line[4];

for(int i = 0; i < 4; i++) 
    line[i] = text.substr(i*4,4);


for(int i = 0; i < 4; i++)
    std::cout << line[i] << "\n";

Этот пример работает.Я получаю «%» для ö.Таким образом, проблема не была в substr ().Сожалею.Я использую Cairo для создания графического интерфейса, и кажется, что мой вывод Cairo вызывает проблемы, а не substr ().

Ответы [ 3 ]

1 голос
/ 12 декабря 2010

STL не заботится о специальных символах. Если существуют многобайтовые последовательности (то есть UTF8), std::string обрабатывает их как последовательность одиночных однобайтовых символов. Если вам нужна правильная обработка Unicode, не используйте встроенный substr или length.

Вы можете, однако, использовать std::wstring (из вашего сообщения неясно, используете ли вы его уже, но я думаю, что нет) - он содержит wchar_t символов - достаточно большой для собственного набора символов ваша целевая платформа.

1 голос
/ 12 декабря 2010

Как насчет подсказки о специальных символах, о которых вы говорите?

Полагаю, вы достигли конца строки.

0 голосов
/ 12 декабря 2010

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

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