Подтвердить что ты не робот

Trim не входит в стандартную библиотеку c/С++?

Является ли это мной или нет стандартных функций отделки в библиотеке c или С++? есть ли какая-либо одна функция, которая действует как обрезка? Если нет, кто-нибудь может сказать мне, почему отделка не входит в стандартную библиотеку? (я знаю, что обрезка находится в режиме повышения)

Мой код отделки

std::string trim(const std::string &str)
{
    size_t s = str.find_first_not_of(" \n\r\t");
    size_t e = str.find_last_not_of (" \n\r\t");

    if(( string::npos == s) || ( string::npos == e))
        return "";
    else
        return str.substr(s, e-s+1);
}

test: cout < trim ( "\n\r\r\n\r\n текст здесь \nwith return\n\r\r\n\r\n" ); -редактировать- Я в основном хотел знать, почему это не было в стандартной библиотеке, ответ BobbyShaftoe велик. trim не входит в стандартную библиотеку c/С++?

4b9b3361

Ответ 1

Причина, по которой trim() не входит в стандартную библиотеку, заключается в том, что при последнем стандарте они должны были балансировать между формализацией текущего поведения (не добавляя ничего нового, просто стабилизируя уже существующее) и добавляя новые функции, В общем, они предпочли не добавлять функцию, если она не будет 1) невозможна иначе, или 2) были значительные недостатки в использовании сторонних библиотек. Слишком много изменений будет

  • совместимость с существующим кодом (который, возможно, определил свой собственный trim()
  • Добавьте больше работы для авторов компиляторов (у которых уже было много работы впереди)
  • Сделайте язык более сложным для изучения и использования.

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

Напротив, что-то вроде строкового класса или вектора - это классы, которые должна предоставить стандартная библиотека, потому что, если вы используете собственный строковый класс, будут работать только строковые операции из этой библиотеки. Со стандартной библиотечной строкой сторонние библиотеки могут ориентироваться на это общее определение строки, и все выигрывают.

Когда вышел последний стандарт, Herb Sutter написал сообщение, описывающее это очень хорошо здесь

Конечно, было бы неплохо иметь функцию trim(), но у них была большая рыба, чтобы жарить. Сначала им пришлось стандартизировать все основы. Я не думаю, что С++ 0x добавит функцию обрезки, но добавит много других утилит удобства, которые еще в 1998 году считались "ненужными" или слишком специализированными.

Ответ 2

Нет, вам нужно написать его самостоятельно или использовать какую-то другую библиотеку, например Boost и т.д.

В С++ вы можете сделать:

#include <string>

const std::string whiteSpaces( " \f\n\r\t\v" );


void trimRight( std::string& str,
      const std::string& trimChars = whiteSpaces )
{
   std::string::size_type pos = str.find_last_not_of( trimChars );
   str.erase( pos + 1 );    
}


void trimLeft( std::string& str,
      const std::string& trimChars = whiteSpaces )
{
   std::string::size_type pos = str.find_first_not_of( trimChars );
   str.erase( 0, pos );
}


void trim( std::string& str, const std::string& trimChars = whiteSpaces )
{
   trimRight( str, trimChars );
   trimLeft( str, trimChars );
} 

Ответ 3

Как говорили другие, комитет был занят (многими) другими вопросами. Boost заполнил некоторые пробелы, например, с помощью библиотеки string_algo функции обрезки:

string testTrim(" \n\r\r\n \r\n text here\nwith return \n\r\r\n \r\n ");
trim(testTrim);
cout << testTrim;

Ответ 4

Я не слишком много знаю о С++, но проверьте это, чтобы узнать, как это сделать в C. (В моем защита: вы сказали C/С++ в заголовке: -)

Ответ 5

В старые времена с scanf() одно пробел будет соответствовать любому количеству пробельных символов.

Вот почему мы использовали fgets(), а затем sscanf(). Чтобы предотвратить совпадение новой строки как части этого пробела.

Ответ 6

Я думаю, главная причина в том, что ' ' - довольно узкое определение пробелов; например, я также хотел бы удалить L' ' и L' ' с помощью функции trim(); однако, только локальная библиотека имеет такое понимание.

То же самое относится к общепринятым методам to_upper и to_lower - есть некоторые люди (особенно в Турции), которые не согласны с типичным отображением c &= ~0x20;, обычно используемым для ASCII.

Ответ 7

Вы можете использовать VС++. Класс CString имеет функцию обрезки.: D