Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #define BLANK_CHAR " \t\r\n" // Строка из разных пустых символов
- #define BUF_SIZE 4096
- #define WB_SIZE 256 // Размер массива указателей на отдельные слова
- // Возвращает указатель на первый символ строки, который не является
- // пробелом, табуляцией или еще чем-то подобным, т.е. представляет
- // собой начало слова.
- // По указателю *next записывает указатель на первый символ после
- // окончания слова или NULL если такого символа нет
- char* get_word( char* str, char** next );
- int main( int argc, char* argv[] )
- {
- char buf[ BUF_SIZE ];
- char* word[ WB_SIZE ];
- unsigned int i = 0;
- unsigned int word_count;
- char* ptr;
- char* next;
- // Загрузим в буфер очередную строку
- snprintf( buf, BUF_SIZE,
- "\tЭто строка\t для разбора на отдельные слова" );
- ptr = buf;
- // Разбор строки
- do
- {
- // Выделим слово
- ptr = get_word( ptr, &next );
- // Сохзаним начало слова
- word[ i ] = ptr;
- // Если есть еще данные в буфере, то приготовимся
- // извелкать их
- if( next )
- {
- ptr = next;
- }
- i++;
- }
- while( next && (i < WB_SIZE) );
- // Сейчас i - это количество слов. Сохраним его
- word_count = i;
- // Посмотрим, что у нас получилось
- for( i = 0; i < word_count; i++ )
- {
- printf( "Слово [%u]: \"%s\"\n", i, word[i] );
- }
- return 0;
- }
- // Возвращает указатель на первый символ строки, который не является
- // пробелом, табуляцией или еще чем-то подобным, т.е. представляет
- // собой начало слова.
- // По указателю *next записывает указатель на первый символ после
- // окончания слова или NULL если такого символа нет
- char* get_word( char* str, char** next )
- {
- char* first;
- char* ptr;
- ptr = str;
- *next = NULL;
- while( *ptr )
- {
- // Байт по указателю *ptr является пробелом?
- if( strchr( BLANK_CHAR, *ptr ) )
- {
- // Да - необходимо перейти на следующий байт
- ptr++;
- }
- else
- {
- // Нет - завершаем цикл
- break;
- }
- }
- // Сохраним начало слова
- first = ptr;
- // Теперь найдем окончание слова
- if( *ptr )
- {
- while( *ptr )
- {
- // Байт по указателю *ptr не является пробелом?
- if( !strchr( BLANK_CHAR, *ptr ) )
- {
- // Да
- ptr++;
- }
- else
- {
- // Нет - завершаем цикл
- break;
- }
- }
- // Проверим, почему завершился цикл
- if( *ptr )
- {
- // Мы остановились потому что нашли пробел
- // Терминируем слово
- *ptr = '\0';
- // Перейдем на следующий символ
- ptr++;
- // Если это не конец строки, то вернем указатель
- // на следующий символ
- if( *ptr )
- {
- *next = ptr;
- }
- }
- }
- return first;
- }
Advertisement
Add Comment
Please, Sign In to add comment