Wie entferne ich das Zeichen an einem bestimmten Index aus einer Zeichenfolge in C?

Lesezeit: 3 Minuten

Benutzeravatar von Favolas
Favolas

Wie entferne ich ein Zeichen aus einer Zeichenfolge?

Wenn ich die Schnur habe "abcdef" und ich möchte entfernen "b" wie mache ich das?

Entferne den Erste Charakter ist einfach mit diesem 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;
}

und

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

werde mir den string ohne den geben letzte Zeichen, aber ich habe immer noch nicht herausgefunden, wie man ein Zeichen in der entfernt Mitte einer Saite.

  • alle Vorkommen eines bestimmten Zeichens: stackoverflow.com/questions/4161822/…

    – Ciro Santilli OurBigBook.com

    27. April 2016 um 14:27 Uhr

Benutzeravatar von Stapler
Stapler

memmove kann mit überlappenden Bereichen umgehen, ich würde so etwas versuchen (nicht getestet, vielleicht +-1-Problem)

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

Vor: "abcdef"

Nach: "abdef"

Versuche dies :

void removeChar(char *str, char garbage) {

    char *src, *dst;
    for (src = dst = str; *src != "https://stackoverflow.com/questions/5457608/'\0'"; src++) {
        *dst = *src;
        if (*dst != garbage) dst++;
    }
    *dst="https://stackoverflow.com/questions/5457608/"\0"";
}

Testprogramm:

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

Ergebnis:

>>acdef

  • Das ist besser, wenn Sie die Position des Zeichens, das Sie entfernen möchten, nicht kennen!

    – Gsamaras

    2. Januar 2015 um 21:50 Uhr

  • Da dieser Code bereits davon ausgeht, dass das Zeichen vorhanden ist, warum nicht einfach for(dst = str; *dst != Garbage; dst++){} *dst = ‘\0’;

    – JayB

    5. Februar 2015 um 19:53 Uhr


Mein Weg, um alle angegebenen Zeichen zu entfernen:

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

  • upvote für gute Struktur und Variablennamen, konnte diesem Code viel leichter folgen als die knappen Variationen oben. Vielen Dank

    – Ace.C

    4. September 2017 um 23:50 Uhr

  • Tolle Lösung! Ich würde einfach für Funktionsnamen wie stimmen removeAllCharOccurrences.

    – Sani

    25. Februar 2021 um 13:11 Uhr

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

Versuche dies . memmove wird es überlappen. Geprüft.

Wirklich überrascht, dass das noch nie gepostet wurde.

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

Ziemlich effizient und einfach. strcpy Verwendet memmove bei den meisten Implementierungen.

  • DAS IST UNDEFINIERTES VERHALTEN. Wie Abschnitt 7.21.2.3 („The strcpy function”) von C99 erklärt: “Wenn zwischen Objekten kopiert wird, die sich überlappen, ist das Verhalten undefiniert.” Was using memmove “bei den meisten Implementierungen” – [citation needed].

    – Maja

    11. September 2019 um 19:27 Uhr

  • strcpy nutzt nicht immer memmoveverlassen Sie sich nicht darauf, tatsächlich tut es das fast nie.

    – chqrlie

    21. Mai um 21:23 Uhr

Benutzeravatar von pevik
pevik

int chartoremove = 1;

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

Hässlich wie die Hölle

  • DAS IST UNDEFINIERTES VERHALTEN. Wie Abschnitt 7.21.2.3 („The strcpy function”) von C99 erklärt: “Wenn zwischen Objekten kopiert wird, die sich überlappen, ist das Verhalten undefiniert.” Was using memmove “bei den meisten Implementierungen” – [citation needed].

    – Maja

    11. September 2019 um 19:27 Uhr

  • strcpy nutzt nicht immer memmoveverlassen Sie sich nicht darauf, tatsächlich tut es das fast nie.

    – chqrlie

    21. Mai um 21:23 Uhr

Benutzeravatar von Dan the Man
Dan der Mann

Im Folgenden wird das Problem etwas erweitert, indem alle Zeichen aus dem ersten Zeichenfolgenargument entfernt werden, die im zweiten Zeichenfolgenargument vorkommen.

/*
 * 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] = "https://stackoverflow.com/questions/5457608/'\0'";
  return l - a;
}

1412710cookie-checkWie entferne ich das Zeichen an einem bestimmten Index aus einer Zeichenfolge in C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy