it-swarm.com.de

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

Wie entferne ich ein Zeichen aus einer Zeichenfolge? 

Wenn ich den String "abcdef" habe und "b" entfernen möchte, wie mache ich das?

Das Entfernen des Zeichens first ist mit diesem Code einfach:

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

ich bekomme die Zeichenfolge ohne das Zeichen last, aber ich habe immer noch nicht herausgefunden, wie man ein Zeichen aus der Zeichenfolge middle entfernt.

43
Favolas

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"

56
stacker

Versuche dies :

void removeChar(char *str, char garbage) {

    char *src, *dst;
    for (src = dst = str; *src != '\0'; src++) {
        *dst = *src;
        if (*dst != garbage) dst++;
    }
    *dst = '\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
36
Fabio Cabral

So entferne ich alle angegebenen Zeichen:

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;
}
9
tBlabs
char a[]="string";
int toBeRemoved=2;
memmove(&a[toBeRemoved],&a[toBeRemoved+1],strlen(a)-toBeRemoved);
puts(a);

Versuche dies . memmove überlappt es . Getestet.

4
SaravananKS
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

4
ssteinberg

Wirklich überrascht, dass dies noch nicht veröffentlicht wurde.

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

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

3
MD XF

Im Folgenden wird das Problem etwas erweitert, indem aus dem ersten String-Argument alle Zeichen entfernt werden, die im zweiten String-Argument 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] = '\0';
  return l - a;
}
2
Dan the Man
#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);
}

Nehmen wir an, dass x das "Symbol" des Zeichens ist, das Sie entfernen möchten.

Der erste Teil zählt alle Zeichen aus dem Index 0 bis einschließlich des Zielzeichens x.

2. Teil enthält alle Zeichen nach x (ohne x)

Jetzt müssen Sie sich nur noch zu beiden Teilen zusammenschließen.

1
Wassim Mohsni

Edit: Aktualisiert den Code zstring_remove_chr() entsprechend der neuesten Version der Bibliothek.

Aus einer von BSD lizenzierten Stringbearbeitungsbibliothek für C mit dem Namen zString

https://github.com/fnoyanisi/zString

Funktion zum Entfernen eines Zeichens

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 Usage

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

Beispielausgabe

  thisisatrialstringtotestthefunction
1
Fehmi Noyan ISI

Dieser Code löscht alle Zeichen, die Sie aus der Zeichenfolge eingeben

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

eingang 

a man, a plan, a canal Panama

ausgabe

 A mn,  pln,  cnl, Pnm!
1
Orkun Tokdemir

Verwenden Sie strcat(), um Zeichenfolgen zu verketten.

strcat() erlaubt jedoch keine Überlappung, sodass Sie eine neue Zeichenfolge erstellen müssen, um die Ausgabe zu speichern.

0
David Heffernan

Folgendes sollte es tun:

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

Ich habe es mit strncpy() und snprintf() versucht.

int ridx = 1;  
strncpy(Word2,Word,ridx);   
snprintf(Word2+ridx,10-ridx,"%s",&Word[ridx+1]);
0

Dies ist, was Sie suchen können, während der Zähler der Zähler ist.

#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;
}
0
iDream
#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;
}
0
Mushrif Ali

Eine andere Lösung, die memmove () zusammen mit index () und sizeof () verwendet:

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 [] enthält jetzt "acdef"

0
presto8

Dies könnte einer der schnellsten sein, wenn Sie den Index übergeben:

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