Как удалить каждый символ из строки, которая соответствует любому символу в другой строке

Это код, который я придумал, но иногда он не работает.

Например, если строка1 = дорога в ад, а строка2 = лестница в рай, вывод будет «ghll», несмотря на то, что «h» находится во второй строке, а также в первой строке. Я не могу понять, почему h не удаляется, как другие символы в обеих строках.

#include <stdio.h>
#include <string.h>
main()
{
    char string1[30], string2[30];
    int length1, length2;

    printf("Enter string 1: ");
    gets(string1);

    printf("Enter string 2: ");
    gets(string2);

    length1 = strlen(string1);
    length2 = strlen(string2);

    for (int i = 0; i <= length1; i++)
    {
        for (int j = 0; j <= length2; j++)
        {
            if (string1[j] == string2[i])
            {
                for (int k = j; k <= length1; k++)
                {
                    string1[k] = string1[k + 1];
                }
            }
        }
    }

    printf("Deleted characters of string 2 from string 1: %s", string1);
}
gets() это плохо. Вместо этого используйте fgets().
Zakk 09.04.2022 21:48
i <= length1 должно быть i < length1
Zakk 09.04.2022 21:49

Вы можете прочитать это: Почему функция gets настолько опасна, что ее нельзя использовать?

Andreas Wenzel 09.04.2022 23:04

Если одна строка содержит символ верхнего регистра H, следует ли отфильтровывать соответствующий символ нижнего регистра h из другой строки?

Andreas Wenzel 09.04.2022 23:06
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
4
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Используйте таблицу поиска, чтобы эффективно применять фильтр символов.
#include <stdio.h>
#include <string.h>

int main() {
    char s1[] = "highway to hell";
    char s2[] = "stairway to heaven";

    printf ("S1: %s\nS2: %s\n", s1, s2);

    char alt[256] = {0};
    //build a lookup table for efficient filtering
    for (int ci = 0; s2[ci]; )
        alt[(unsigned char)s2[ci++]] = 1;

    int slen = 0;
    for (int ci = 0; s1[ci]; ++ci) {
        if (alt[(unsigned char)s1[ci]]) continue;
        s1[slen++] = s1[ci];
    }
    s1[slen] = '\0';
    printf ("S1 after S2 filter : %s\n", s1);

    return 0;
}
  1. gets() устарело, используйте вместо него fgets().

  2. fgets(): если читается новая строка (\n), она сохраняется в буфере. Обрезать буфер перед использованием: Удаление завершающего символа новой строки из ввода fgets()

int s1len = strlen (s1); int s2len = strlen (s2); не нужен. Возможно, вместо этого for (int ci = 0; ci < s2len; ) --> for (int ci = 0; s2[ci]; ).
chux - Reinstate Monica 09.04.2022 22:06

Другие вопросы по теме