1

Тема: Робота з символьними рядками

У мене є завдання : ввести речення і вилучити з нього всі слова, які містять задану двосимвольну комбінацію. Надрукувати скорочене речення та вказати скільки слів вилучено.

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>

int main()
{
    system("chcp 1251");
    char sent[100], symb[3];
    int words[50], withSymb[50], size = 51, k = 1, n = 0, del = 0,d=0;
    words[0] = 0;
    char* p = sent;

    printf("\nВведіть речення: \n");
    gets_s(sent);

    printf("Введіть двосимвольну комбінацію: \n");
    gets_s(symb);


    for (int i = 0; i < size - 1; i++) {
        if (*(p + i) >='\0 ' && *(p+i)<='@') {
            words[k] = i;
            k++;
        }
        if (*(p + i) == symb[0] && sent[i + 1] == symb[1]) {
            withSymb[n] = k - 1;
            n++;
        }
    }

    if (n == 0) {
        printf("В даному реченні слів з заданою комбінацією немає.\n");
        return 0;
    }

    for (int i = 0; i < n && withSymb[i] != k - 1; i++) {
        for (int j = words[i] - del; j < size - (words[i + 1] - words[i]); j++) {
            sent[j] = sent[j + (words[i + 1] - words[i])];
        }
        for (int j = size - (words[i + 1] - words[i]); j < size; j++) {
            sent[j] = '\0';
            
        }
        
        size -= (words[i + 1] - words[i]);
        del += (words[i + 1] - words[i]);
        d++;
    }
    
    if (withSymb[n - 1] == k - 1) {
        sent[words[k - 1] - del] = '\0';

    }
    printf("Скорочене речення:");
    puts(sent);
    printf("Вилучено слів - %d\n",d);
    return 0;
}

Програма працює погано + через це проблема з підрахунком вилучених слів. Допоможіть, будь ласка, це виправити.

https://replace.org.ua/misc.php?action=pun_attachment&amp;item=2093

2 Востаннє редагувалося koala (19.01.2021 15:38:09)

Re: Робота з символьними рядками

Що значить "погано"?
Де другий параметр gets_s?
Як саме визначається слово?

3 Востаннє редагувалося Lena_17 (19.01.2021 15:55:00)

Re: Робота з символьними рядками

koala написав:

Що значить "погано"?
Де другий параметр gets_s?
Як саме визначається слово?

Слова визначаються циклом

if (*(p + i) >='\0 ' && *(p+i)<='@'){...}

"погано", тому що програма не завжди виводить правильну відповідь

Post's attachments

Results.jpg 67.18 kb, 5 downloads since 2021-01-19 

4

Re: Робота з символьними рядками

Питання про слово було не про код. Слова розділені пробілами, чи складаються з літер, чи ще якось?
Там має бути дуже багато досить очевидних попереджень. Не ігноруйте їх. Можливо, помилка ховається саме за ними.
Наскільки я бачу, p виставлено на sent і ніде не змінюється. Нащо вам зайва змінна? Щоб складніше було?

5 Востаннє редагувалося lucas-kane (23.01.2021 17:57:00)

Re: Робота з символьними рядками

Пані Lena_17 Ваша програма працює погано через те що банально виходить за межі масиву sent. Я так розумію у вас є масив words, на котрого ви спираєтесь і точкою відліку циклу є цей масив. Давши на вході речення зі словами, кількість слів у цьому реченні не завжди буде рівне 50. І у Ваших прикладах їх кількість менше за 50, а цикл ви чомусь проходите відносно масиву words, не масиву sent, тобто дочекавшись його останнього нульового символу.

А на рахунок змінної вказівника p, я думаю це і справді зайве. Ті дії котрі Ви з ним проводите можна проводити і з ім’ям масиву. Його доцільно використовувати тільки у тому випадку коли Ви не хочете створювати ітераційну змінну i для циклу. Тобто

У Вас є масив і Ви хочете дізнатись його довжину, тоді код із додатковою змінною буде:

Прихований текст
int main()
{
    char str[] = "Hello World!";

    size_t i = 0;
    for (; str[i] != '\0';)
        i++;

    size_t len;

    len = str[i] - str[0] + 1;
    // len = i + 1;

    return 0;
}

а із вказівником:

Прихований текст
int main()
{
    char str[] = "Hello World!", *p;

    p = str;
    for (; *p != '\0';)
        p++;

    size_t len = p - str + 1;

    return 0;
}

Про це раджу прочитати книгу Денніса Рітчі та Браяна Кернігана, Мова програмування Сі.

Взагалі Ваше завдання це пошук підрядка (префікса чи суфікса) у рядку. На цю тему є вже готові алгоритми (Z-функіця, Алгоритм Кнута — Морріса — Пратта та багато інших подібних алгоритмів) Скоріше за все Відповідь на Ваше питання Ви знайдете саме в них.