Подтвердить что ты не робот

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

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

Если у меня есть строка "abcdef", и я хочу удалить "b", как это сделать?

Удаление этого символа первым выполняется с помощью этого кода:

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

int main()
{
   char word[] = "abcdef";
   char word2[10];

   strcpy(word2,&word[1]);

   printf("%s\n", word2);

   return 0;
}

и

strncpy(word2,word,strlen(word)-1);

предоставит мне строку без символа last, но я до сих пор не понял, как удалить char в середине строки.

4b9b3361

Ответ 1

Memmove может обрабатывать перекрывающиеся области, я бы попробовал что-то вроде этого (не тестировался, может быть, проблема + -1)

char word[] = "abcdef";  
int idxToDel = 2; 
memmove(&word[idxToDel], &word[idxToDel + 1], strlen(word) - idxToDel);

До: "abcdef"

После: "abdef"

Ответ 2

Попробуйте следующее:

void removeChar(char *str, char garbage) {

    char *src, *dst;
    for (src = dst = str; *src != '\0'; src++) {
        *dst = *src;
        if (*dst != garbage) dst++;
    }
    *dst = '\0';
}

Программа тестирования:

int main(void) {
    char* str = malloc(strlen("abcdef")+1);
    strcpy(str, "abcdef");
    removeChar(str, 'b');
    printf("%s", str);
    free(str);
    return 0;
}

Результат:

>>acdef

Ответ 3

Мой способ удалить все указанные символы:

void RemoveChars(char *s, char c)
{
    int writer = 0, reader = 0;

    while (s[reader])
    {
        if (s[reader]!=c) 
        {   
            s[writer++] = s[reader];
        }

        reader++;       
    }

    s[writer]=0;
}

Ответ 4

int chartoremove = 1;
strncpy(word2,word,chartoremove);
strncpy(((char*)word2)+chartoremove,((char*)word)+chartoremove+1,strlen(word)-1-chartoremove);

Уродливый как ад

Ответ 5

Далее будет задана бит, удалив из первого аргумента строки любой символ, который встречается во втором строковом аргументе.

/*
 * delete one character from a string
 */
static void
_strdelchr( char *s, size_t i, size_t *a, size_t *b)
{
  size_t        j;

  if( *a == *b)
    *a = i - 1;
  else
    for( j = *b + 1; j < i; j++)
      s[++(*a)] = s[j];
  *b = i;
}

/*
 * delete all occurrences of characters in search from s
 * returns nr. of deleted characters
 */
size_t
strdelstr( char *s, const char *search)
{ 
  size_t        l               = strlen(s);
  size_t        n               = strlen(search);
  size_t        i;
  size_t        a               = 0;
  size_t        b               = 0;

  for( i = 0; i < l; i++)
    if( memchr( search, s[i], n))
      _strdelchr( s, i, &a, &b);
  _strdelchr( s, l, &a, &b);
  s[++a] = '\0';
  return l - a;
}

Ответ 6

char a[]="string";
int toBeRemoved=2;
memmove(&a[toBeRemoved],&a[toBeRemoved+1],strlen(a)-toBeRemoved);
puts(a);

Попробуйте это. memmove будет перекрывать его. Испытано.

Ответ 7

Изменить: Обновлен код zstring_remove_chr() в соответствии с последней версией библиотеки.

Из библиотеки лицензированных строк BSD для C, называемой zString

https://github.com/fnoyanisi/zString

Функция удаления символа

int zstring_search_chr(char *token,char s){
    if (!token || s=='\0')
        return 0;

    for (;*token; token++)
        if (*token == s)
            return 1;

    return 0;
}

char *zstring_remove_chr(char *str,const char *bad) {
    char *src = str , *dst = str;

    /* validate input */
    if (!(str && bad))
        return NULL;

    while(*src)
        if(zstring_search_chr(bad,*src))
            src++;
        else
            *dst++ = *src++;  /* assign first, then incement */

    *dst='\0';
    return str;
}

Использование Exmaple

   char s[]="this is a trial string to test the function.";
   char *d=" .";
   printf("%s\n",zstring_remove_chr(s,d));

Пример вывода

  thisisatrialstringtotestthefunction

Ответ 8

Этот код удалит все символы, которые вы вводите из строки

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

#define SIZE 1000

char *erase_c(char *p, int ch)
{
    char *ptr;

    while (ptr = strchr(p, ch))
        strcpy(ptr, ptr + 1);

    return p;
}

int main()
{
    char str[SIZE];
    int ch;

    printf("Enter a string\n");
    gets(str);
    printf("Enter the character to delete\n");
    ch = getchar();

    erase_c(str, ch);

    puts(str);

    return 0;
}

ввод

a man, a plan, a canal Panama

Выход

 A mn,  pln,  cnl, Pnm!

Ответ 9

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

int main(){
    char ch[15],ch1[15];
    int i;
    gets(ch);  // the original string
    for (i=0;i<strlen(ch);i++){  
        while (ch[i]==ch[i+1]){ 
            strncpy(ch1,ch,i+1); //ch1 contains all the characters up to and including x
            ch1[i]='\0'; //removing x from ch1
            strcpy(ch,&ch[i+1]);  //(shrinking ch) removing all the characters up to and including x from ch
            strcat(ch1,ch); //rejoining both parts
            strcpy(ch,ch1); //just wanna stay classy
        }
    }
    puts(ch);
}

Предположим, что x является "символом" символа, который вы хотите удалить , моя идея состояла в том, чтобы разделить строку на две части:

1-я часть будет считать все символы из индекса 0 до (и включая) целевого символа x.

Вторая часть подсчитывает все символы после x (не включая x)

Теперь вам нужно только присоединиться к обоим частям.

Ответ 10

Используйте strcat() для конкатенации строк.

Но strcat() не позволяет перекрывать, поэтому вам нужно создать новую строку для хранения вывода.

Ответ 11

Следующее должно сделать это:

#include <stdio.h>
#include <string.h>
int main (int argc, char const* argv[])
{
    char word[] = "abcde";
    int i;
    int len = strlen(word);
    int rem = 1;

    /* remove rem'th char from word */
    for (i = rem; i < len - 1; i++) word[i] = word[i + 1];
    if(i < len) word[i] = '\0';

    printf("%s\n", word);
    return 0;
}

Ответ 12

Я пробовал с strncpy() и snprintf().

int ridx = 1;  
strncpy(word2,word,ridx);   
snprintf(word2+ridx,10-ridx,"%s",&word[ridx+1]);

Ответ 13

Другое решение, использующее memmove() вместе с index() и sizeof():

char buf[100] = "abcdef";
char remove = 'b';

char* c;
if ((c = index(buf, remove)) != NULL) {
    size_t len_left = sizeof(buf) - (c+1-buf);
    memmove(c, c+1, len_left);
}

buf [] теперь содержит "acdef"

Ответ 14

Это может быть один из самых быстрых, если вы передадите индекс:

void removeChar(char *str, unsigned int index) {
    char *src;
    for (src = str+index; *src != '\0'; *src = *(src+1),++src) ;
    *src = '\0';
}

Ответ 15

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 50
void dele_char(char s[],char ch)
{
    int i,j;

    for(i=0;s[i]!='\0';i++)
    {
        if(s[i]==ch)
        {
            for(j=i;s[j]!='\0';j++)
            s[j]=s[j+1];
            i--;
        }
    }
}

int main()
{
    char s[MAX],ch;
    printf("Enter the string\n");
    gets(s);
    printf("Enter The char to be deleted\n");
    scanf("%c",&ch);
    dele_char(s,ch);
    printf("After Deletion:= %s\n",s);
    return 0;
}

Ответ 16

Это то, что вы можете искать, в то время как счетчик - это индекс.

#include <stdio.h>

int main(){

    char str[20];
    int i,counter;
    gets(str);
    scanf("%d", &counter);

    for (i= counter+1; str[i]!='\0'; i++){
        str[i-1]=str[i];
    }
    str[i-1]=0;
    puts(str);



    return 0;
}

Ответ 17

вот как я реализовал то же самое в С++.

#include <iostream>
#include <cstring>

using namespace std;

int leng;
char ch;
string str, cpy;

int main() {
    cout << "Enter a string: ";
    getline(cin, str);
    leng = str.length();
    cout << endl << "Enter the character to delete: ";
    cin >> ch;
    for (int i=0; i<leng; i++) {
        if (str[i] != ch)
        cpy += str[i];
    }
    cout << endl << "String after removal: " << cpy;
    return 0;
}

Ответ 18

Удобный, простой и быстрый способ избавиться от \0 - это скопировать строку без последнего char (\ 0) с помощью strncpy вместо strcpy:

strncpy(newStrg,oldStrg,(strlen(oldStrg)-1));