Народ не подскажет ли кто каким образом из строки убрать лишние пробелы и управляющие символы (\n,\r и др.). Мысль коечно есть но не хотелося б посимвольно читать строку. Может есть другие варианты. Хотелося б увидеть варианты на С или С++(не VCL,MFS b др).
Заранее благодарен.
Здравствуйте, bip29, Вы писали:
B> Народ не подскажет ли кто каким образом из строки убрать лишние пробелы и управляющие символы (\n,\r и др.). Мысль коечно есть но не хотелося б посимвольно читать строку. Может есть другие варианты. Хотелося б увидеть варианты на С или С++(не VCL,MFS b др). B>Заранее благодарен.
STL пойдет?!
// Trim begin/end spacesif(tempStr.find_first_of(' ')==0)
tempStr.replace(0, tempStr.find_first_not_of(' '), "");
if (!tempStr.empty() && (tempStr.find_last_of(' ')+1)==tempStr.size())
tempStr.replace(tempStr.find_last_not_of(' '), std::string::npos, "");
Здравствуйте, bip29, Вы писали:
B> Народ не подскажет ли кто каким образом из строки убрать лишние пробелы и управляющие символы (\n,\r и др.). Мысль коечно есть но не хотелося б посимвольно читать строку. Может есть другие варианты. Хотелося б увидеть варианты на С или С++(не VCL,MFS b др). B>Заранее благодарен.
имхо тут в любом случае в независимости от того как ты обершёь эту фичу в красивую обёртку внутри алгоритм всё равно будет работаь либо через индекс массива либо через указатель инкрементируя его. Не стои затрат по времени так как кроме вшенести ты ничего не выйграешь
B> Народ не подскажет ли кто каким образом из строки убрать лишние пробелы и управляющие символы (\n,\r и др.). Мысль коечно есть но не хотелося б посимвольно читать строку. Может есть другие варианты. Хотелося б увидеть варианты на С или С++(не VCL,MFS b др).
gok>>Mожет что за один проход есть?
AI>имхо тут в любом случае в независимости от того как ты обершёь эту фичу в красивую обёртку внутри алгоритм всё равно будет работаь либо через индекс массива либо через указатель инкрементируя его. Не стои затрат по времени так как кроме вшенести ты ничего не выйграешь
Приведённое решение работает за квадратичное время от длины строки. Так что может легко взорваться
Даже просто строка из 100 000 пробелов скорее всего будет обрабатываться очень очень долго (надо будет переслать что-то порядка 5 000 000 000 байт из памяти в память
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, bip29, Вы писали:
B> Народ не подскажет ли кто каким образом из строки убрать лишние пробелы и управляющие символы (\n,\r и др.). Мысль коечно есть но не хотелося б посимвольно читать строку. Может есть другие варианты. Хотелося б увидеть варианты на С или С++(не VCL,MFS b др).
Привет!
Интересно было бы сравнить со скоростью ещё и такого подхода:
bool isMySpace( char ch )
{
return ch == ' '; // это соответсвует твоему примеру.
// а это чуть гибче, и более соответсвует тому, что просишь :)return isspace( ch ) || ch == '\n'/*|| что хочешь ещё.*/;
// как варинат можно и так:const char* spaces = " \t\r\n";
return strchar( spaces, ch ) != 0; // :)
}
void removeExtraSpaces( CString& str )
{
int length = str.GetLength();
int insPos = 0;
int curPos = 0;
char* ptr = str.GetBuffer( length );
while( curPos < Length ) {
if( !isMySpace( ptr[curPos] ) ) {
ptr[insPOs++] = ptr[curPos++];
continue;
}
ptr[insPos] = ' ';
curPos++;
while( curPos < length && isMySpace( ptr[curPOs] ) )
curPos++;
}
ptr[insPos] = 0;
str.ReleaseBuffer( insPos );
}
Опять же интересно узнать что за строчки использовались для измерения
Что-то мне так кажется, что такой C-style подход должен сильно делать и твой CString и предложенные STL варианты на строчках, где есть заметное число замен. Скажем где все слова разделены цепочками из нескольких пробелов и слов много
p. s.
1) Компилятора с MFC под рукой нету . Если не компилится, то прости. Я думаю тебе тут помогут отладить
2) Я так понял, что CString -- это из MFC
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Удаление лишних пробелов в строке C-style :)