Обрезка не является частью стандартной библиотеки C / C ++? - PullRequest
16 голосов
/ 26 января 2009

Это я или нет стандартных функций обрезки в библиотеке 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 текст здесь \ nс возвратом \ n \ r \ r \ n \ r \ n"); -редактировать- В основном я хотел знать, почему этого не было в стандартной библиотеке, ответ БоббиШафто великолепен. <a href="https://stackoverflow.com/questions/479080/trim-is-not-part-of-the-standard-c-c-library#479091"> trim не является частью стандартной библиотеки c / c ++?

Ответы [ 7 ]

29 голосов
/ 26 января 2009

Нет, вы должны написать это самостоятельно или использовать какую-то другую библиотеку, такую ​​как 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 );
} 
16 голосов
/ 26 января 2009

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

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

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

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

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

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

3 голосов
/ 26 января 2009

Как уже говорили другие, комитет был занят (многими) другими вопросами. Повышение заполнило некоторые пробелы, как в функциях усечения библиотеки string_algo :

string testTrim(" \n\r\r\n \r\n text here\nwith return \n\r\r\n \r\n ");
trim(testTrim);
cout << testTrim;
1 голос
/ 25 марта 2011

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

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

1 голос
/ 26 января 2009

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

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

1 голос
/ 26 января 2009

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

0 голосов
/ 07 мая 2009

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

...