C++ Удаляет новую строку из многострочной строки

Это - распространенная ошибка, начиная использовать контейнер МОК. См. этот связанный вопрос .

Вкратце:

  • Это - плохая практика для раздавания контейнера (там, сделанный, что, и это действительно причиняет боль)
  • , Если действительно необходимо взывать непосредственно к контейнеру, сначала рассмотреть абстракцию к введенной фабрике, затем поскольку последний ресурс рассматривает использование статического шлюза к контейнеру

51
задан shergill 28 September 2009 в 08:00
поделиться

9 ответов

#include <algorithm>
#include <string>

std::string str;

str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());

Поведение std :: remove может быть не совсем таким, как вы ожидали. См. Объяснение здесь .

108
ответ дан 7 November 2019 в 09:53
поделиться

Если ожидается, что новая строка будет в конце строки, то:

if (!s.empty() && s[s.length()-1] == '\n') {
    s.erase(s.length()-1);
}

Если строка может содержать много новых строк в любом месте строки:

std::string::size_type i = 0;
while (i < s.length()) {
    i = s.find('\n', i);
    if (i == std::string:npos) {
        break;
    }
    s.erase(i);
}
9
ответ дан 7 November 2019 в 09:53
поделиться

Вы должны использовать идиому стирать-удалить , ища '\ n' . Это будет работать для любого стандартного контейнера последовательности; не только строка .

7
ответ дан 7 November 2019 в 09:53
поделиться

Код удаляет все новые строки из строки str .

Реализация O (N) лучше всего обслуживается без комментариев к SO и с комментариями в производстве.

unsigned shift=0;
for (unsigned i=0; i<length(str); ++i){
    if (str[i] == '\n') {
        ++shift;
    }else{
        str[i-shift] = str[i];
    }
}
str.resize(str.length() - shift);
1
ответ дан 7 November 2019 в 09:53
поделиться

Использовать std :: алгоритмы. В этом вопросе есть несколько подходящих предложений для повторного использования Удалить пробелы из std :: string в C ++

1
ответ дан 7 November 2019 в 09:53
поделиться
 std::string some_str = SOME_VAL;
 if ( some_str.size() > 0 && some_str[some_str.length()-1] == '\n' ) 
  some_str.resize( some_str.length()-1 );

или (удаляет несколько символов новой строки в конце)

some_str.resize( some_str.find_last_not_of(L"\n")+1 );
1
ответ дан 7 November 2019 в 09:53
поделиться

Если это где-нибудь в строке, чем вы не можете сделать лучше, чем O (n).

И единственный способ - найти '\ n' в строке и стереть ее.

for(int i=0;i<s.length();i++) if(s[i]=='\n') s.erase(s.begin()+i);

Для большего количества символов новой строки, чем:

int n=0;
for(int i=0;i<s.length();i++){
    if(s[i]=='\n'){
        n++;//we increase the number of newlines we have found so far
    }else{
        s[i-n]=s[i];
    }
}
s.resize(s.length()-n);//to delete only once the last n elements witch are now newlines

It стирает все символы новой строки один раз.

0
ответ дан 7 November 2019 в 09:53
поделиться

Все эти ответы кажутся мне немного тяжелыми.

Если вы просто закончите удалите '\ n' и переместите все остальное на место, вы можете столкнуться с некоторыми персонажами странным образом. Так почему бы просто не сделать простую (и наиболее эффективную) вещь: заменить все '\ n пробелами?

for (int i = 0; i < str.length();i++) {
   if (str[i] == '\n') {
      str[i] = ' ';
   }
}

Могут быть способы улучшить скорость этого по краям, но это будет намного быстрее, чем перемещение целых кусков строка вокруг в памяти.

-1
ответ дан 7 November 2019 в 09:53
поделиться

Обычно зеленая стрелка рядом со строкой кода означает, что «это следующая строка, которая будет выполнена, если бы не тот факт, что мы застряли где-то в более глубоком фрейме стека. " Однако VS не позволяет сказать наверняка на основе предоставленной на данный момент информации ...

[РЕДАКТИРОВАТЬ - конечно, глубокое знание Win32 может дать очень хорошее предположение - см. Ответ «mos» для вероятного объяснения, основанного на известных ловушках API GetWindowText ()]

Как уже упоминалось, что Visual Studio показывает, что иногда вводит в заблуждение. Чтобы получить более полное представление о том, что именно происходит, вам нужно отключить некоторые бесполезные «функции», которые VS включает по умолчанию. В Инструменты -> Параметры -> Отладка -> Общие убедитесь, что:

  • Включить отладку на уровне адресов = ВКЛ
  • Включить только мой код = ВЫКЛ
  • Включить поддержку исходного сервера = ВКЛ

Это должно позволить вам to:

1) прервать / перешагнуть / и т. д. точную инструкцию, которая вызывает взаимоблокировку

2) просмотреть полную трассировку стека до этого момента, независимо от модуля (ов)

3) см. исходный код по возможности, предполагая, что ваш символ &

1
ответ дан 7 November 2019 в 09:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: