trim не является частью стандартной библиотеки c/C++?

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

мой код обрезки

std::string trim(const std::string &str)
{
    size_t s = str.find_first_not_of(" nrt");
    size_t e = str.find_last_not_of (" nrt");

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

тест: cout отделка не входит стандартной библиотеки c / C++?

7 ответов


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

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

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

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

когда вышел последний стандарт, Херб Саттер написал сообщение, описывающее это очень хорошо!--17-->здесь

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


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

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

#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 );
} 

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;

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

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


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


Я думаю, что главная причина в том, что ' ' - Это довольно узкое определение пробелов; например, я тоже хочу!--1--> и L' ' удалены , однако, только locale библиотека имеет такое понимание.

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


вы можете использовать VC++. Класс CString имеет функцию trim. : D