EvgeniiKraaaaaaaav

5.3

Dec 26th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.61 KB | None | 0 0
  1. //https://vk.com/evgenykravchenko0
  2.  
  3.                 ___                                        ___                   ___    
  4.                /  /\                  ___                 /  /\                 /  /\    
  5.               /  /:/_                /__/\               /  /:/_               /  /:/_  
  6.              /  /:/ /\               \  \:\             /  /:/ /\             /  /:/ /\  
  7.             /  /:/ /:/_               \  \:\           /  /:/_/::\           /  /:/ /:/_
  8.            /__/:/ /:/ /\          ___  \__\:\         /__/:/__\/\:\         /__/:/ /:/ /\
  9.            \  \:\/:/ /:/         /__/\ |  |:|         \  \:\ /~~/:/         \  \:\/:/ /:/
  10.             \  \::/ /:/          \  \:\|  |:|          \  \:\  /:/           \  \::/ /:/
  11.              \  \:\/:/            \  \:\__|:|           \  \:\/:/             \  \:\/:/  
  12.               \  \::/              \__\::::/             \  \::/               \  \::/  
  13.                \__\/                   ~~~~               \__\/                 \__\/    
  14.                             ___                                            
  15.                            /__/\                ___                 ___    
  16.                            \  \:\              /  /\               /  /\    
  17.                             \  \:\            /  /:/              /  /:/    
  18.                         _____\__\:\          /__/::\             /__/::\    
  19.                        /__/::::::::\         \__\/\:\__          \__\/\:\__
  20.                        \  \:\~~\~~\/            \  \:\/\            \  \:\/\
  21.                         \  \:\  ~~~              \__\::/             \__\::/
  22.                          \  \:\                  /__/:/              /__/:/
  23.                           \  \:\                 \__\/               \__\/  
  24.                            \__\/                      
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27.  
  28.  
  29. char **strplit(const char *str);
  30.  
  31. int main(int argc, char *argv[])
  32. {
  33.    
  34.     char src_str[256] = { 0 }, // исходна€ строка
  35.         *dst_str = NULL;
  36.     char **words_arr = NULL;
  37.     int i;
  38.    
  39.     //memset(src_str, 0, sizeof(src_str)); 
  40.     printf("¬ведите слова, разделЄнные пробелами:\n");
  41.     gets(src_str);
  42.    
  43.     words_arr = strplit(src_str);
  44.     if (words_arr) // если функци€ вернула ненулевой результат// выводим все слова в консоль, пока не дойдЄм до нулевого указател€
  45.     {
  46.         printf("—лова из входной строки:\n");
  47.         i = 0;
  48.         while (words_arr[i])
  49.         {
  50.             printf("%s\n", words_arr[i]);
  51.             i ++;
  52.         }          
  53.     }  
  54.  
  55.     return 0;
  56. }
  57.  
  58. // «адание 3. Split
  59. char **strplit(const char *str)
  60. {  
  61.     char **res = NULL,      // результат
  62.         *pin = (char *)str, // указатель на текущую позицию чтени€
  63.         *word,              // указатель на новое выходное слово
  64.         *tmp;               // вспомогательный указатель дл€ копировани€ слова
  65.        
  66.     int word_count, cur_len, i, is_end;    
  67.     word_count = cur_len = is_end = 0;
  68.    
  69.     // выпол€нем до конца входной строки
  70.     while (1)
  71.     {
  72.         if (*pin != ' ' && *pin != '\0')    // если не пробел и не конец строки
  73.             cur_len ++;             // увеличиваем длину очередного слова
  74.         else if (cur_len > 0)       // иначе, если в очередном слове есть хоть один символ
  75.         {
  76.             // выдел€ем пам€ть под новое слово
  77.             word = (char *)malloc((cur_len + 1) * sizeof(char));
  78.             if (word == NULL)
  79.                 return NULL;
  80.            
  81.             // устанавливаем указатель на начало слова
  82.             tmp = pin - cur_len;
  83.            
  84.             // копируем слово в новую строка
  85.             for (i = 0; i < cur_len; i ++)
  86.                 word[i] = tmp[i];
  87.                
  88.             // не забываем символ конца строки
  89.             word[cur_len] = '\0';
  90.            
  91.             // обнул€ем длину текущего слова
  92.             cur_len = 0;
  93.            
  94.             // выдел€ем пам€ть под указатель на новую строку
  95.             word_count ++;
  96.             res = (char **)realloc(res, (word_count + 1) * sizeof(char *));
  97.             if (res == NULL)
  98.                 return NULL;
  99.                
  100.             res[word_count - 1] = word; // запоминаем указатель на полученное слово
  101.             res[word_count] = NULL;     // обнул€ем последний указатель
  102.         }
  103.        
  104.         // переходим к следующему символу
  105.         if (*pin != '\0')
  106.             pin ++;
  107.         else
  108.             return res;
  109.     }
  110. }
Add Comment
Please, Sign In to add comment