Guest User

Untitled

a guest
Oct 10th, 2018
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.58 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define BLANK_CHAR  " \t\r\n"   // Строка из разных пустых символов
  5. #define BUF_SIZE    4096
  6. #define WB_SIZE 256 //  Размер массива указателей на отдельные слова
  7.  
  8. //  Возвращает указатель на первый символ строки, который не является
  9. //  пробелом, табуляцией или еще чем-то подобным, т.е. представляет
  10. //  собой начало слова.
  11. //  По указателю *next записывает указатель на первый символ после
  12. //  окончания слова или NULL если такого символа нет
  13. char*   get_word( char* str, char** next );
  14.  
  15. int main( int argc, char* argv[] )
  16. {
  17.     char    buf[ BUF_SIZE ];
  18.     char*   word[ WB_SIZE ];
  19.     unsigned int    i = 0;
  20.     unsigned int    word_count;
  21.     char*   ptr;
  22.     char*   next;
  23.  
  24.     //  Загрузим в буфер очередную строку
  25.     snprintf( buf, BUF_SIZE,
  26.         "\tЭто    строка\t для разбора на отдельные   слова" );
  27.  
  28.     ptr = buf;
  29.     //  Разбор строки
  30.     do
  31.     {
  32.         //  Выделим слово
  33.         ptr = get_word( ptr, &next );
  34.         //  Сохзаним начало слова
  35.         word[ i ] = ptr;
  36.         //  Если есть еще данные в буфере, то приготовимся
  37.         //  извелкать их
  38.         if( next )
  39.         {
  40.             ptr = next;
  41.         }
  42.         i++;
  43.     }
  44.     while( next && (i < WB_SIZE) );
  45.  
  46.     //  Сейчас i - это количество слов. Сохраним его
  47.     word_count = i;
  48.     //  Посмотрим, что у нас получилось
  49.     for( i = 0; i < word_count; i++ )
  50.     {
  51.         printf( "Слово [%u]: \"%s\"\n", i, word[i] );
  52.     }
  53.  
  54.     return  0;
  55. }
  56.  
  57. //  Возвращает указатель на первый символ строки, который не является
  58. //  пробелом, табуляцией или еще чем-то подобным, т.е. представляет
  59. //  собой начало слова.
  60. //  По указателю *next записывает указатель на первый символ после
  61. //  окончания слова или NULL если такого символа нет
  62. char*   get_word( char* str, char** next )
  63. {
  64.     char*   first;
  65.     char*   ptr;
  66.  
  67.     ptr = str;
  68.     *next = NULL;
  69.     while( *ptr )
  70.     {
  71.         //  Байт по указателю *ptr является пробелом?
  72.         if( strchr( BLANK_CHAR, *ptr ) )
  73.         {
  74.             //  Да - необходимо перейти на следующий байт
  75.             ptr++;
  76.         }
  77.         else
  78.         {
  79.             //  Нет - завершаем цикл
  80.             break;
  81.         }
  82.     }
  83.  
  84.     //  Сохраним начало слова
  85.     first = ptr;
  86.     //  Теперь найдем окончание слова
  87.     if( *ptr )
  88.     {
  89.         while( *ptr )
  90.         {
  91.             //  Байт по указателю *ptr не является пробелом?
  92.             if( !strchr( BLANK_CHAR, *ptr ) )
  93.             {
  94.                 //  Да
  95.                 ptr++;
  96.             }
  97.             else
  98.             {
  99.                 //  Нет - завершаем цикл
  100.                 break;
  101.             }
  102.         }
  103.         //  Проверим, почему завершился цикл
  104.         if( *ptr )
  105.         {
  106.             //  Мы остановились потому что нашли пробел
  107.             //  Терминируем слово
  108.             *ptr = '\0';
  109.             //  Перейдем на следующий символ
  110.             ptr++;
  111.             //  Если это не конец строки, то вернем указатель
  112.             //  на следующий символ
  113.             if( *ptr )
  114.             {
  115.                 *next = ptr;
  116.             }
  117.         }
  118.     }
  119.  
  120.     return  first;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment