Advertisement
Guest User

Untitled

a guest
Feb 7th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.70 KB | None | 0 0
  1. // l__8.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. /*
  7. Задание:
  8.  
  9. Дана строка, содержащая от 1 до 30 слов,
  10. в каждом из которых от 1 до 10 латинских
  11. букв и/или цифр; между соседними
  12. словами – не менее одного пробела,
  13. за последним словом – точка.
  14. Напечатать все слова, отличные от
  15. последнего слова, предварительно преобразовав
  16. каждое из них по следующему правилу: удалить из слова первую букву.
  17. */
  18. #define _CRT_SECURE_NO_WARNINGS
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <stdlib.h>
  22. #include <locale.h>
  23.  
  24.  
  25. // Режим отладки
  26. #define DEBUG 0
  27.  
  28. // Прототипы функций
  29. void remmove(char *str);
  30. int parsing(char *str, char **words);
  31.  
  32. int main()
  33. {
  34. char string[350], **words = NULL;
  35. int i, n;
  36.  
  37. setlocale(LC_ALL, "rus");
  38. setlocale(LC_NUMERIC, "eng");
  39.  
  40. #if DEBUG
  41. strcpy(string, "abc 4DfU abc f6g abc.");
  42.  
  43. #else
  44. printf("Лабораторная работа № 8\n"
  45. "Ввод исходных данных.\n\n");
  46. printf("Введите строку, содержащую от 1 до 30 слов,\n"
  47. "в каждом из которых от 1 до 10 символов;\n"
  48. "между соседними словами – не менее одного пробела,\n"
  49. "за последним словом – точка.\n"
  50. "(КОРРЕКТНОСТЬ ВВЕДЁННОЙ СТРОКИ НЕ ПРОВЕРЯЕТСЯ!)\n");
  51. gets(string);
  52.  
  53. #endif
  54.  
  55. words = (char**) malloc(sizeof(char*) * 30);
  56. if (*words == NULL)
  57. {
  58. printf("Не удалось выделить память для массива указателей на слова!\n");
  59. return 1;
  60. }
  61. n = parsing(string, words); //разбиение на слова
  62. if (n == 0)
  63. {
  64. printf("В строке нет слов!\n");
  65. free(words);
  66. return 1;
  67. }
  68. else
  69. if (n < 0)
  70. {
  71. printf("Не удалось выделить память для слов!\n");
  72. return 1;
  73. }
  74.  
  75.  
  76. printf("\n\n"
  77. "список слов (если есть)\n");
  78. for (i = 0; i < n; i++) {
  79. if (strcmp(words[n - 1], words[i]) != 0)
  80. { // Если текущее слово не совпадает с последним,
  81. remmove(words[i]);
  82. puts(words[i]); // вывести его на экран
  83. }
  84. }
  85. printf("\n"
  86. "Исходная строка:\n%s\n\n", string);
  87. for (i = 0; i < n; i++)
  88. free(words[i]);//Удаляем слова
  89. free(words); //Удаляем массив указателей на слова
  90. words = NULL;
  91. system("Pause");
  92. return 0;
  93. }
  94.  
  95. /*********************************************************
  96. * функция
  97. * void remove(char *str)
  98. * удаляет из строки все первые символы.
  99. *
  100. * Вход:
  101. * str - указатель на исходную строку
  102. *
  103. * Выход:
  104. * str - указатель на преобразованную строку
  105. *
  106. * Возвращаемое значение:
  107. * нет
  108. *
  109. **********************************************************/
  110. void remmove(char *str)
  111. {
  112. char *p;
  113.  
  114. p = str;
  115. strcpy(p, p + 1); //удаляем символ
  116. }
  117.  
  118. /*********************************************************
  119. * функция
  120. * int parsing(char *str, char **words)
  121. * выделяет из строки слова (разделитель - пробел(ы))
  122. * и размещает их в массиве words
  123. *
  124. * Ограничения:
  125. * - строка завершается точкой
  126. * - в строке не более 30 слов
  127. * - в слове не более 10 символов
  128. *
  129. * Вход:
  130. * str - указатель на исходную строку
  131. *
  132. * Выход:
  133. * words - динамический массив указателей на слова
  134. *
  135. * Возвращаемое значение:
  136. * количество слов
  137. *
  138. **********************************************************/
  139. int parsing(char *str, char **words)
  140. {
  141. int n, len, i;
  142. char *pword, *p;
  143.  
  144. for (p = str, n = 0; *p != '.';) { // пока в строке не встретится точка
  145. while ((*p != '.') && (*p == ' '))
  146. { //пока не конец предложения и пока пробелы
  147. p++; //переход к следующему символу
  148. }
  149. pword = p; // запоминаем в pword адрес слова
  150. if (*pword != '.')
  151. { // если мы не в конце строки,
  152. p = strchr(pword, ' '); // ищем первый пробел
  153. if (p == NULL) { // Если пробел не найден,
  154. p = strchr(pword, '.'); // то ищем конец предложения
  155. }
  156. len = p - pword; // вычисляем длину слова
  157.  
  158. words[n] = (char*) malloc(sizeof(char)*(len + 1));//выделяем память для нового слова
  159. if (words[n] == NULL){
  160. for (i = 0; i < n; i++)
  161. free(words[i]);//Удаляем уже выделенные слова
  162. return -1;//не удалось выделить память для очередного слова - ошибка
  163. }
  164. 20:16:00
  165. strncpy(words[n], pword, len); // копируем слово
  166. // в соответствующий элемент
  167. // массива слов и увеличиваем количество слов
  168. words[n][len] = '\0'; // иногда strncpy не дописывает нулевой байт
  169. n++; // количество слов увеличилось
  170. }
  171. }
  172. return n;
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement