Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // l__8.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- /*
- Задание:
- Дана строка, содержащая от 1 до 30 слов,
- в каждом из которых от 1 до 10 латинских
- букв и/или цифр; между соседними
- словами – не менее одного пробела,
- за последним словом – точка.
- Напечатать все слова, отличные от
- последнего слова, предварительно преобразовав
- каждое из них по следующему правилу: удалить из слова первую букву.
- */
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <locale.h>
- // Режим отладки
- #define DEBUG 0
- // Прототипы функций
- void remmove(char *str);
- int parsing(char *str, char **words);
- int main()
- {
- char string[350], **words = NULL;
- int i, n;
- setlocale(LC_ALL, "rus");
- setlocale(LC_NUMERIC, "eng");
- #if DEBUG
- strcpy(string, "abc 4DfU abc f6g abc.");
- #else
- printf("Лабораторная работа № 8\n"
- "Ввод исходных данных.\n\n");
- printf("Введите строку, содержащую от 1 до 30 слов,\n"
- "в каждом из которых от 1 до 10 символов;\n"
- "между соседними словами – не менее одного пробела,\n"
- "за последним словом – точка.\n"
- "(КОРРЕКТНОСТЬ ВВЕДЁННОЙ СТРОКИ НЕ ПРОВЕРЯЕТСЯ!)\n");
- gets(string);
- #endif
- words = (char**) malloc(sizeof(char*) * 30);
- if (*words == NULL)
- {
- printf("Не удалось выделить память для массива указателей на слова!\n");
- return 1;
- }
- n = parsing(string, words); //разбиение на слова
- if (n == 0)
- {
- printf("В строке нет слов!\n");
- free(words);
- return 1;
- }
- else
- if (n < 0)
- {
- printf("Не удалось выделить память для слов!\n");
- return 1;
- }
- printf("\n\n"
- "список слов (если есть)\n");
- for (i = 0; i < n; i++) {
- if (strcmp(words[n - 1], words[i]) != 0)
- { // Если текущее слово не совпадает с последним,
- remmove(words[i]);
- puts(words[i]); // вывести его на экран
- }
- }
- printf("\n"
- "Исходная строка:\n%s\n\n", string);
- for (i = 0; i < n; i++)
- free(words[i]);//Удаляем слова
- free(words); //Удаляем массив указателей на слова
- words = NULL;
- system("Pause");
- return 0;
- }
- /*********************************************************
- * функция
- * void remove(char *str)
- * удаляет из строки все первые символы.
- *
- * Вход:
- * str - указатель на исходную строку
- *
- * Выход:
- * str - указатель на преобразованную строку
- *
- * Возвращаемое значение:
- * нет
- *
- **********************************************************/
- void remmove(char *str)
- {
- char *p;
- p = str;
- strcpy(p, p + 1); //удаляем символ
- }
- /*********************************************************
- * функция
- * int parsing(char *str, char **words)
- * выделяет из строки слова (разделитель - пробел(ы))
- * и размещает их в массиве words
- *
- * Ограничения:
- * - строка завершается точкой
- * - в строке не более 30 слов
- * - в слове не более 10 символов
- *
- * Вход:
- * str - указатель на исходную строку
- *
- * Выход:
- * words - динамический массив указателей на слова
- *
- * Возвращаемое значение:
- * количество слов
- *
- **********************************************************/
- int parsing(char *str, char **words)
- {
- int n, len, i;
- char *pword, *p;
- for (p = str, n = 0; *p != '.';) { // пока в строке не встретится точка
- while ((*p != '.') && (*p == ' '))
- { //пока не конец предложения и пока пробелы
- p++; //переход к следующему символу
- }
- pword = p; // запоминаем в pword адрес слова
- if (*pword != '.')
- { // если мы не в конце строки,
- p = strchr(pword, ' '); // ищем первый пробел
- if (p == NULL) { // Если пробел не найден,
- p = strchr(pword, '.'); // то ищем конец предложения
- }
- len = p - pword; // вычисляем длину слова
- words[n] = (char*) malloc(sizeof(char)*(len + 1));//выделяем память для нового слова
- if (words[n] == NULL){
- for (i = 0; i < n; i++)
- free(words[i]);//Удаляем уже выделенные слова
- return -1;//не удалось выделить память для очередного слова - ошибка
- }
- 20:16:00
- strncpy(words[n], pword, len); // копируем слово
- // в соответствующий элемент
- // массива слов и увеличиваем количество слов
- words[n][len] = '\0'; // иногда strncpy не дописывает нулевой байт
- n++; // количество слов увеличилось
- }
- }
- return n;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement