Удаление символа из строки на языке c, получение ошибки конфликтующих типов

Я действительно новичок в кодировании и работал над предположительно простой проблемой удаления символа из строки на языке c. Когда я пытаюсь скомпилировать свой код, я продолжаю получать ошибку: конфликтующие типы для команды "удалить". Я не знаю, почему я получаю эту ошибку, потому что код в порядке. Мы будем благодарны за помощь в этом. Это код

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

 int main()
{
    char ch,str[30],word[30];
    void remove(char[],char[],char);
    printf("enter the string\n");
    gets(str);
    printf("enter the character to move\n");
    ch=getchar();
    remove(str,word,ch);
    printf("converted to %s\n",word);

}

void remove(char str[], char word[],char c){
int j=0,k=0;
while(str[j++]!='\0'){
if(str[j]!=c)word[k++]=str[j];}
word[k]='\0';

}

2 ответа

Заголовок <stdio.h> уже есть объявление функции с именем remove.

int remove(const char *filename);

Таким образом, компилятор выдает ошибку, потому что идентификатор remove объявляется два раза с разными типами в одной и той же области файла.

Так что переименуйте свою функцию, например, remove_copy.

Тем не менее, реализация функции неправильная.

Внутри цикла

while(str[j++]!='\0'){
if(str[j]!=c)word[k++]=str[j];}

вы сравниваете следующий элемент str[j]!=c после тока из-за приращения в условии

str[j++]

Функцию можно объявить и реализовать следующим образом

char * remove_copy( char s1[], const char s2[], char c )
{
    char *p = s1;

    for ( ; *s2; ++s2 )
    {
        if ( *s2 != c ) 
        {
            *p++ = *s2;
        }
    }
    
    *p = '\0';

    return s1;
}  

Обратите внимание, что функция getsнебезопасно и больше не поддерживается стандартом C. Вместо этого используйте стандартную функциюfgets.

Вот демонстрационная программа.

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

char * remove_copy( char s1[], const char s2[], char c )
{
    char *p = s1;

    for ( ; *s2; ++s2 )
    {
        if ( *s2 != c ) 
        {
            *p++ = *s2;
        }
    }
    
    *p = '\0';

    return s1;
}  

int main(void) 
{
    enum { N = 30 };
    char str[N], word[N];
    char c;
    
    printf( "Enter a string: " );
    fgets( str, N, stdin );
    
    str[ strcspn( str, "\n" ) ] = '\0';
    
    printf( "Enter a character to remove from the string: " );
    c = getchar();
    
    printf( "The result string is \"%s\"\n", remove_copy( word, str, c ) );
    
    return 0;
}

Его вывод может выглядеть как

Enter a string: I am learning C++
Enter a character to remove from the string: +
The result string is "I am learning C"
  1. Измените имя функции. remove зарезервировано
  2. Вы все равно не работаете
#include <stdio.h>
char *strchrrem(const char *str, char *dest, char c)
{
    char *wrk = dest;
    do
    {
        if(*str != c) *wrk++ = *str;
    }while(*str++);

    return dest;
}

int main(void)
{
    char dest[64];

    printf("%s\n", strchrrem("Hello world.", dest, 'l'));
}

https://godbolt.org/z/exqdE4

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