Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2021, 23:01   #1
CrossCriss
 
Регистрация: 31.05.2021
Сообщений: 5
По умолчанию (Си)Замена отдельно стоящего слова computer на pc

Функция replace_pc (s)
Назначение: замена в строке s отдельно стоящих слов computer на PC.
Например, есть строка:
Protects your computer as you are working, surfing and playing.
После замены получим:
Protects your PC as you are working, surfing and playing.

Нужно сделать через индексы и указатели, но ничего не получается((
Буду очень благодарен!

Код:
#include<stdio.h>
int main()
{
    char arr[100], comp[] = " pc ";
    int i, j, temp;

    puts("Enter a string ");
    gets_s(arr, 100);
    for (i = 0; i < strlen(arr); i++)
    {
        if (arr[i] == ' ' && arr[i + 1] == 'c' && arr[i + 2] == 'o' && arr[i + 3] == 'm' && arr[i + 4] == 'p' && arr[i + 5] == 'u' && arr[i + 6] == 't' && arr[i + 7] == 'e' && arr[i + 8] == 'r' && arr[i + 9] == ' ')
        {
            temp = i;
            for (j = i+10; j >= i; j--)
            {
                arr[j - 1 ] = arr[j];
            }
            for (j = 0; j < strlen(comp); j++, temp++)
                arr[temp] = comp[j];
        }
    }
    puts(arr);
    return 0;
}
CrossCriss вне форума Ответить с цитированием
Старый 01.06.2021, 03:11   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
#include <stdio.h>

int main()
{
    char arr[100], old_val[] = " computer ", new_val[] = " pc ";
    puts("Enter a string ");
    gets_s(arr, 100);
    char *old_arr_p = arr, *new_arr_p = arr;
    while (*old_arr_p)
    {
        char *old_val_p = old_val, *tmp = old_arr_p;
        while (*tmp && *old_val_p && *tmp == *old_val_p)
        {
            tmp++;
            old_val_p++;
        }
        if (*old_val_p == 0)
        {
            char *new_val_p = new_val;
            while (*new_val_p)
            {
                *new_arr_p = *new_val_p;
                new_arr_p++;
                new_val_p++;
            }
            old_arr_p = tmp;
        } else {
            *new_arr_p = *old_arr_p;
            new_arr_p++;
            old_arr_p++;
        }
    }
    *new_arr_p = 0;
    puts(arr);
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.06.2021, 14:33   #3
CrossCriss
 
Регистрация: 31.05.2021
Сообщений: 5
По умолчанию

BDA, Огромное спасибо, все работает, не могли бы вы обьяснить как это все таки работает?
CrossCriss вне форума Ответить с цитированием
Старый 01.06.2021, 19:34   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Стоит отметить, что этот код сработает только при замене более длинного слова на более короткое. Если вкратце, то имеются два указателя на одну строку arr. И происходит запись из "старого" указателя в "новый" по одному символу, пока "старый" указатель не укажет на нуль-символ. Но перед записью символа проверяется, что в массиве по текущему "старому" указателю не лежит строка old_val. Для этого производится сравнение символов по "временному" указателю и указателю на old_val. Если указатель на old_val достиг нуль-символа, то в исходной строке действительно была строка old_val, и надо записать по "новому" указателю строку new_val, а "старый" указатель переставить на конец сравнения, иначе просто переписать символ из "старого" указателя в "новый", а сами указатели подвинуть на символ вперед. Можете взять бумажку в клетку, записать более простое предложение и более короткие слова для поиска и замены, и провести замену вручную.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.06.2021, 21:57   #5
CrossCriss
 
Регистрация: 31.05.2021
Сообщений: 5
По умолчанию

BDA, Большое спасибо!
CrossCriss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поочередная замена одинаковых значений (Каждых отдельно) paradise9373 Помощь студентам 0 23.08.2018 17:45
Распределить текстовую информацию по столбцам: отдельно название фирмы, отдельно - номер телефона Dessz_de_Laerre Microsoft Office Excel 6 24.08.2016 10:25
Нахождение числа, стоящего не на своем месте yarovik Паскаль, Turbo Pascal, PascalABC.NET 7 15.11.2012 11:41
замена цифр на слова Form_13 Помощь студентам 0 22.12.2011 02:44
Числа отдельно, хлам отдельно Keetotko Общие вопросы C/C++ 6 18.10.2010 18:15