Поехали дальше ... от конца к началу?
Olej писал(а): ↑29.01.2016 16:27
№6 : Разбейте произвольную русскоязычную строку на слова, и выведите слова в обратном первоначальному порядке.
Код: Выделить всё
inline void c2w( char *c, wchar_t *w ) {
int n = -1;
setlocale( LC_ALL, "" ); // только после этого работают преобразования!
while( n != 0 )
c += ( n = mbtowc( w++, c, MB_CUR_MAX ) );
}
void revers( wchar_t *w ) {
wchar_t *sec, wb[ 40 ];
if( NULL == ( sec = wcschr( w, L' ' ) ) ) return;
wcsncpy( wb, w, sec - w )[ sec - w ] = L'\0';
while( L' ' == *sec ) sec++;
revers( sec );
wcscat( wcscat( wmemmove( w, sec, wcslen( sec ) + 1 ), L" " ), wb );
}
#define LENGTH 160
char buf [ LENGTH ] = "тестовая русскоязычная строка в UTF-8 с прямым порядком слов ";
wchar_t wbuf [ LENGTH ];
void test05( void ) {
c2w( buf, wbuf );
while( L' ' == wbuf[ wcslen( wbuf ) - 1 ] )
wbuf[ wcslen( wbuf ) - 1 ] = L'\0';
printf( "устранение завершающих пробелов: '%ls'\n", wbuf );
revers( wbuf );
printf( "реверсирование слов: '%ls'\n", wbuf );
revers( wbuf );
printf( "реверсирование слов: '%ls'\n", wbuf );
}
Этот код выдернут из совсем другого контекста, поэтому его не обсуждаем...
А сформулирована задача и показан пример вот для чего:
- разобрать содержимое любой русскязычной строки (или китайской) у вас не получится без установления локали ... setlocale( LC_ALL, "" ) или подобным способом;
- разобрать содержимое русскязычной строки не получится в формате char [] - нужно преобразовывать к широким символам wchar_t []
- преобразования делаются группой функция вида mb*() (mbtowc() и др. - пеобразования
мультибайтных символов в
широкие);
- для работы с широкими символами используется такой же набор строчных функций как str*(), только начинаться они будут с префикса wcs*();
Код: Выделить всё
$ ./unicode
устранение завершающих пробелов: 'тестовая русскоязычная строка в UTF-8 с прямым порядком слов'
реверсирование слов: 'слов порядком прямым с UTF-8 в строка русскоязычная тестовая'
реверсирование слов: 'тестовая русскоязычная строка в UTF-8 с прямым порядком слов'
Реверс слов сдесь делается дважды, чтобы в итоге прийти к тому, с чего начали.