Hoe verwijder je het teken bij een bepaalde index uit een string in C?

Hoe verwijder ik een teken uit een tekenreeks?

Als ik de string "abcdef"heb en ik wil "b"verwijderen, hoe doe ik dat dan?

Het verwijderen van het eersteteken is eenvoudig met deze code:

#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;
}

en

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

geeft me de tekenreeks zonder het laatste-teken, maar ik heb nog steeds niet ontdekt hoe ik een teken in het middenvan een tekenreeks kan verwijderen.


Antwoord 1, autoriteit 100%

memmovekan overlappende gebieden aan, zou ik proberen zoiets (niet getest, misschien +-1 probleem)

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

Vroeger: "abcdef"

Na: "abdef"


Antwoord 2, autoriteit 66%

Probeer dit:

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

Testprogramma:

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

Resultaat:

>>acdef

Antwoord 3, Autoriteit 25%

Mijn manier om alle opgegeven tekens te verwijderen:

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;
}

Antwoord 4, Autoriteit 9%

Echt verrast dit is niet eerder gepost.

strcpy(&str[idx_to_delete], &str[idx_to_delete + 1]);

vrij efficiënt en eenvoudig. strcpyGebruikt memmoveover de meeste implementaties.


Antwoord 5, Autoriteit 8%

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

Probeer dit. Memmove zal het overlappen.
Getest.


Antwoord 6, Autoriteit 6%

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

lelijk als de hel


Antwoord 7, Autoriteit 2%

Het volgende breidt het probleem een ​​beetje uit door te verwijderen van het eerste string-argument elk karakter dat optreedt in het tweede string-argument.

/*
 * 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;
}

Antwoord 8, autoriteit 2%

#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);
}

Laten we aannemen dat x het “symbool” is van het teken dat u wilt verwijderen
,mijn idee was om de snaar in 2 delen te verdelen:

Het eerste deel telt alle tekens van de index 0 tot (en inclusief) het doelteken x.

2e deel telt alle tekens na x (exclusief x)

Nu hoef je alleen nog maar beide delen samen te voegen.


Antwoord 9

Gebruik strcat()om strings samen te voegen.

Maar strcat()staat geen overlapping toe, dus u moet een nieuwe tekenreeks maken om de uitvoer vast te houden.


Antwoord 10

Ik heb het geprobeerd met strncpy()en snprintf().

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

Antwoord 11

Een andere oplossing, waarbij memmove() samen met index() en sizeof() wordt gebruikt:

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[] bevat nu “acdef”


Antwoord 12

Dit is misschien wel een van de snelste, als je de index haalt:

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

Antwoord 13

Deze code verwijdert alle tekens die u invoert uit de tekenreeks

#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;
}

invoer

a man, a plan, a canal Panama

Uitgang

A mn,  pln,  cnl, Pnm!

Antwoord 14

bewerken: Bijgewerkt de code zstring_remove_chr()volgens de nieuwste versie van de bibliotheek.

van een BSD-licentie-string-verwerkingsbibliotheek voor C, genaamd zstring

https://github.com/fnoyanisi/zstring

functie om een ​​teken

te verwijderen

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 gebruik

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

Voorbeelduitgang

 thisisatrialstringtotestthefunction

Antwoord 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;
}

Antwoord 16

Dit is waar je naar op zoek bent terwijl teller de index is.

#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;
}

Antwoord 17

Ik weet dat de vraag erg oud is, maar ik zal mijn implementatie hier achterlaten:

char    *ft_strdelchr(const char *str,char c)
{
        int   i;
        int   j;
        char  *s;
        char  *newstr;
        i = 0;
        j = 0;
        // cast to char* to be able to modify, bc the param is const
        // you guys can remove this and change the param too
        s = (char*)str;
        // malloc the new string with the necessary length. 
        // obs: strcountchr returns int number of c(haracters) inside s(tring)
        if (!(newstr = malloc(ft_strlen(s) - ft_strcountchr(s, c) + 1 * sizeof(char))))
                return (NULL);
        while (s[i])
        {
                if (s[i] != c)
                {
                        newstr[j] = s[i];
                        j++;
                }
                i++;
        }
        return (newstr);
}

gooi gewoon de tekens die niet gelijk zijn aan het teken dat u wilt verwijderen naar een nieuwe tekenreeks.


Antwoord 18

Het volgende zou het moeten doen:

#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;
}

Antwoord 19

zo heb ik hetzelfde in c++ geïmplementeerd.

#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;
}

Antwoord 20

Een handige, eenvoudige en snelle manier om van \0 af te komen, is door de string te kopiëren zonder de laatste char (\0) met behulp van strncpy in plaats van strcpy:

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

Other episodes