2013-10-26 3 views
2

У меня есть строка ... «ЯДРА», и мне сложно использовать подстроку для эффективного управления строкой. Моя цель - добавить «-» каждые 3 символа. Моя проблема в том, что, когда «APPLES» проходит, он возвращает «APP-ES-», что неверно, я пытаюсь вернуть его «APP-LES-» любые предложения? Вот мой код до сих пор ...C++: использование подстроки для создания новой строки

+0

Ваш j ++ сделает это, измените его на j + = 3 и удалите j = j + 3 из тела –

+0

Имея оба 'j ++' и 'j = j + 3', это ужасно. Для вашего исправления не запускайте 'j' до конца строки – Bathsheba

ответ

5

Просто создайте отдельную строку, скопировав соответствующие детали.

std::string s; 
for(size_t i = 0; i < str.length(); i += 3) { 
    s += str.substr(i, 3) + "-"; 
} 

(Точно так же вы обратите внимание, это точно: str.substr(j,j+3); неверен, он не будет копировать 3-х символов, он будет копировать j + 3 символов Прочитайте документацию более тщательно.).

+0

+1 (особенно для' size_t'), но вы должны упомянуть об ошибках повторной конкатенации строк. – Bathsheba

+0

@Bathsheba Спасибо! Ну, может быть, да :) Я не могу беспокоиться о производительности, пока программа не верна, хотя ;-) (и все равно она будет оптимизирована). –

1

Вы увеличивающиеся J дважды:

for(int j = 0; j <= str.length(); j++){ 
            ^-- once here 
... 
    j = j+3; 
    ^-- and again here 

Кроме того, похоже, что вы можете получить два - сек в конце строки с длиной это кратно трем, так как вы проверяете для j <= str.length() вместо j < str.length() T чень:

for(size_t j = 0; j < str.length(); j+=3){ 
    str_substr += str.substr(j,3) + '-'; 
} 
cout << str_substr; 
0

Поскольку вы, очевидно, просто скопировав результат cout, во всяком случае, может быть, это проще всего пропустить промежуточную строку, и просто скопировать 3-х символов в COUT, затем написать -, больше трех символов и т.д. .

#include <string> 
#include <iterator> 
#include <iostream> 

int main(){ 
    std::string input("APPLES"); 

    size_t len = 3; 

    for (size_t pos = 0; pos < input.length(); pos += len) 
     std::cout << input.substr(pos, len) << "-";  
} 

Если вам необходимо изменить существующую строку, вы, вероятно, хотите, чтобы начать вычисления количества черточек, которые вы собираетесь вставить, а затем работать с конца строки обратно в начале, двигаясь каждый персонажа непосредственно к месту назначения. Если вы начинаете с фронта и вставляете дефисы там, где это необходимо, он заканчивается как алгоритм O (N). Работа от конца до начала и перемещение каждого символа непосредственно к месту назначения - O (N).

Смежные вопросы