Как удалить несколько символов из строки в C?

в настоящее время я могу удалить один символ из строки, но я не могу понять, как настроить «символ», чтобы он мог удалить несколько символов ... какие-либо предложения?

#include <string.h>

void remove_character(char *string, char *remove);

int main(void){
    char s[] = "Thi!s is s!ome tex!t that we'!ll check for plagiarism";
    char symbol[] = "!";

    printf("%s\n", s);
    remove_character(s, symbol);
    printf("%s\n", s);

    return(0);
}
 
void remove_character(char *string, char *remove){
    int position = 0;

    while (string[position] != '\0')
    {
        if (string[position] == *remove){
            
            int newposition = position;

            while (string[newposition] != '\0')
            {
                string[newposition] = string[newposition+1];
                newposition++;
            }
            
        } else position++;
    }  
    

}
 
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
94
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы можете удалить 1, просто зациклите функцию для массивов съемных символов.

void remove_character(char *string, char remove){
    int position = 0;

    while (string[position] != '\0')
    {
        if (string[position] == remove){
            
            int newposition = position;

            while (string[newposition] != '\0')
            {
                string[newposition] = string[newposition+1];
                newposition++;
            }
            
        } else position++;
    }  
    

}

void remove_character(char *string, char *remove){

     for(each char in remove){
remove_character(string, remove[index])
}



Ответ принят как подходящий

Вам не нужно «сжимать» строку каждый раз, когда функция встречает удаляемый символ.

#include <stdio.h>
#include <string.h>

// Define the function ahead of its use. It is its own prototype.
void remove_character( char *str, char *remove ) {
    // copy characters, but only increment destination for "non-remove" characters.
    for( size_t src = 0, dst = 0; ( str[dst] = str[src] ) != '\0'; src++ )
        dst += (strchr( remove, str[dst] ) == NULL);
}

int main( void ) {
    char s[] = "Thi!s is s!ome tex!t that we'!ll check for plagiarism";
    char symbols[] = "!s"; // Stripping out '!' and 's'

    puts( s ); // simpler
    remove_character( s, symbols );
    puts( s ); // simpler

    return 0; // return is NOT a function call. No '()'.
}
Thi!s is s!ome tex!t that we'!ll check for plagiarism
Thi i ome text that we'll check for plagiarim

Спасибо, это работает, но можете ли вы объяснить, что означают «src» и «dst», если они что-то значат ?? Такого еще не видел :)

Wolo 23.10.2022 12:36
src и dst - это просто две индексные переменные... "от источника к месту назначения"... Источник увеличивается до конца строки. Назначение увеличивается только тогда, когда символ должен быть сохранен (возможно, перезапись скопированного символа, который должен быть удален). Всего два индекса...
Fe2O3 23.10.2022 12:38

Вам нужно скопировать всю оставшуюся часть строки, иначе вы только замените один символ другим, используйте memmove.

#include <string.h>
#include <stdio.h>

void main(void)
{
    char String[] = { "Hello" };
    char Remove = 'l';
    char* pSearch = String;

    while (*pSearch) // is not 0
    {
        if (*pSearch == Remove)
            memmove(pSearch, pSearch + 1, strlen(pSearch) + 1);
        else 
            pSearch++;
    }
    printf("%s\n", String);
}

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