Я пытаюсь обрезать строку с помощью функции rtrim()
из заголовка строки в C ++ без использования алгоритма.
Что я сделал, так это изучил начальную и конечную позицию, если есть место, просто удалите его, используя isspace()
но когда я компилирую, теперь я получаю эту ошибку:
неверная инициализация неконстантной ссылки типа ‘std :: string& {aka std :: basic_string&} ’Из значения типа« const char * »
и вот мой код:
#include <iostream>
#include <string>
using namespace std;
string rtrim(string& s) {
size_t i;
for(i = s.length() - 1; i != (size_t)-1; i--) {
if(!(isspace(s[i]))){
break;
}
}
return s.substr(0, i + 1);
}
int main(){
cout << "|" << rtrim(" hello world\t ") << "|" << endl;
}
всякий раз, когда я устанавливаю такой параметр, как string s = ( "hello world\t ");
и беги cout << rtrim(s) << endl;
кажется, работает, но это не работает, как в коде выше. какие-либо предложения?
Приведенный выше код создаст временный объект std::string
в стеке и передать его функции в качестве неконстантной ссылки. Это опасно, так как функция может изменить объект (что не имеет смысла) или запомнить ссылку на объект и попытаться изменить его вне его области, как только объект уже уничтожен.
В вашей функции вам на самом деле не требуется non-const
ссылка, поэтому просто измените параметр на const std::string &s
и это будет работать.
Других решений пока нет …