Zeichen durch String ersetzen



  • Hi Leute,
    folgende Problemstellung:
    Ich habe einen String. Aus diesem String möchte ich ein gewisses Zeichen, sagen wir einen "/" mit dem String "\t>>\t" ersetzen. Dabei sollen keine Zeichen verloren gehen. Wie stelle ich das am besten an? Bin bisher noch zu keiner funktionierenden Lösung gekommen 😞

    Danke



  • Was hast Du denn schon probiert?

    Mögliche Lösung:
    1. sicherstellen, dass der Speicher des Strings für (urspr. Länge + 3 + Nullbyte) Zeichen ausreicht,
    2. den Teilstring hinter '/' (am besten inkl. Nullbyte) mit z.B. memmove um 3 Stellen verschieben,
    3. den String "\t>>\t" mit z.B. memcpy an die Position des '/' schreiben,



  • danke mal für den schnellen post.
    ich habe verschiedene sachen mit Stringfunktionen probiert, aber wie gesagt, hat nix funktioniert. z.b. strtok glaub ich wars, bei / den string teilen. Als Rückgabewert bekomme ich ja den ersten teil dann vom string, aber wie ich zum 2. komme, ist mir ein rästel



  • Sowas wie

    char *t, *teststring = "lsgfdtrdf/fjhvghlkhvjcg";
    t = malloc(strlen(teststring+1); //string kopieren
    strcpy(t, teststring);
    teststring = t;
    for (; *t!='/'; t++); //'/' suchen
    *t = '\0'; // '/' mit '\0' überschreiben
    printf("%s\t>>\t", teststring);
    printf("\t>>\t");
    printf("%s\n", t[1]);
    

    Statt printf mit sprintf in einen String reinschreiben und statt malloc(strlen(teststring+1) malloc(strlen(teststring+strlen(ersetzungsstring)) und es sollte gehen.



  • equest0r schrieb:

    danke mal für den schnellen post.
    ich habe verschiedene sachen mit Stringfunktionen probiert, aber wie gesagt, hat nix funktioniert. z.b. strtok glaub ich wars, bei / den string teilen. Als Rückgabewert bekomme ich ja den ersten teil dann vom string, aber wie ich zum 2. komme, ist mir ein rästel

    Zum 2. kommst du, wenn du strtok mit NULL aufrufst, gucki:
    http://www.cplusplus.com/reference/clibrary/cstring/strtok/

    Wie wäre es mit einer etwas flexibleren Funktion, die nicht nur einzelne Zeichen, sondern ganze Zeichenfolgen durch andere ersetzen kann.
    So ca. meine ich das:

    char* repbinabyc ( char* a, char* b, char* c ); // replace b in a by c :)
    

    Alle Vorkommnisse von b in a sollen durch c ersetzt werden. Ist c == NULL, sollen alle b gelöscht werden.

    Die Anwendung sähe so aus:

    char* repbinabyc ( char* a, char* b, char* c )
    {
    	// To be written yet.
    	return NULL; 
    }
    
    int main() 
    { 
    	char* s = repbinabyc ( "le xxx cusku", "xxx", "be'avu" );
    	if ( s != NULL )
    		puts(s); // Ergebnis: "le be'avu cusku!"
    	free (s);
    
    	s = repbinabyc ( "el xxxxxxxxxxxxxx grande!", "xxxxxxxxxxxxxx", "hermano" );
    	if ( s != NULL )
    		puts(s); // Ergebnis: "el hermano grande"
    	free (s);
    
    // ...
    
    }
    

    Gruß,
    B.B.



  • Das funktioniert bei mir wie der gute alte COBOL inspect meyer repacing
    hugo by schorsch

    Ja ich verwende ab und an ein goto - wenns verbote wäre, würds der
    Compiler nicht anbieten.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <libpferd.h>
    /* beschreibung siehe libpferd.h */
    /* Linkage section */
    int suchlaenge;
    int inspect (char *zeile, char *such, char *ersetz)
    {
    /* Working Storage Section */
    int rc = 0;
    int stelle = 0;
    int beginn = 0;
    int offset = 0;
    int offset2 = 0;
    int laenge = 0;
    int laenge2 = 0;
    char such1[1];
    /* Dummy-Section */
    char *teilstring1;
    char *teilstring2;
    char *savestring;
    int bytes = 0;
    int null = 0;
    such1[0] = 0;
    suchlaenge = 0;
    /* Procedure Division */
    laenge = strlen(zeile);
    bytes = laenge + 1;
    /* Dynamischen Speicher holen */
    teilstring1 = malloc(bytes);
    teilstring2 = malloc(bytes);
    savestring  = malloc(bytes);
    /* sichern eingabestring */
    strcpy(savestring,zeile);
    beginn = (int) strstr(zeile,such1);
    stelle = (int) strstr(zeile,such);
    rc = 0;
    if (stelle == 0)
    {
    rc = 16;
    goto ende;
    }
    offset = stelle - beginn;
    mvc ((void *) teilstring1, (void *) zeile, &null, &offset); 
    suchlaenge = strlen(such);
    offset2 = offset + suchlaenge + 1;
    laenge2 = strlen(zeile) - offset - suchlaenge -1;
    mvc ((void *) teilstring2, (void *) zeile, &offset2, &laenge2); 
    ende:
    strcpy (zeile,teilstring1);
    strcat(zeile,ersetz);
    strcat(zeile,teilstring2);
    if (rc > 0)
    {
    strcpy(zeile,savestring);
    }
    /* ..und wieder freigeben */
    free (teilstring1);
    free (teilstring2);
    free (savestring);
        return rc;
    }
    


  • ganz schön viel code für eine stringersetzung und hiter mvc steckt auch noch eine unbekannte anzahl zeilen:

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_mvc" in Funktion "_inspect".

    mfg,
    c.n.



  • compil0r n00b schrieb:

    ganz schön viel code für eine stringersetzung...

    ja, furchtbar. und dann auch noch mit mallocs drin.
    versuch mal so:

    #include <stdio.h>
    #include <string.h>
    
    void substitute (char *in, char *out, char *from, char *to)
    {
      size_t len_from = strlen (from);
      size_t len_to = strlen (to);
      while (*in)
      {
        ptrdiff_t diff = strstr (in, from) - in;
        if (in+diff != 0)
        {
          memcpy (out, in, diff);
          out += diff;
          memcpy (out, to, len_to);
          out += len_to;
          in = in + diff + len_from;
        }
        else
        {
          *out++ = *in++;
        }
      }
      *out = 0;
    }
    
    void main (void)
    {
      char *in= "drei chinesen mit dem kontrabass sassen auf der strasse und erzaehlten sich was";
      char out[256];
      substitute (in, out, "e", "u");
      puts (in);
      puts (out);
    }
    

    ^^geht auch mit längeren strings und nicht nur mit einzelnen zeichen.
    🙂



  • Ist eleganter wie meine Lösung - aber wenn man sich C selbst beibringt
    und aus der CObol- und Assembler-Welt kommt...
    Übrigns MVC - das kommt aus der Assemblerwelt und ich hab mir für C da
    nen entsprechenden Ersatz geschrieben.



  • pferdefreund schrieb:

    Übrigns MVC - das kommt aus der Assemblerwelt und ich hab mir für C da
    nen entsprechenden Ersatz geschrieben.

    MVC? http://en.wikipedia.org/wiki/Model_view_controller
    🙂



  • Das hat damit nix zu tun - das ist eine IBM-Assembler-Anweisung
    MVC = Move Character.
    mvc meyer,mueller
    > die Daten des strings mueller werden nach meyer uebertragen, wobei noch mit
    + und (nn) usw die Position bestimmt werden kann.
    + steht fuer Offset und (nn) fuer Laenge.
    Such mal S/370 und assembler in der Suchmaschine deines Vertrauens...



  • Das kannst Du mit memcpy oder strcpy oder strncpy auch haben.

    Ganz allgemein sollest Du, gerade als Umsteiger von diesen Sprachen, hier im Forum oft mitlesen und viel mitnehmen. Ist nicht böse gemeint, aber nach meiner Erfahrung schreiben ehemalige COBOL-Programmierer die grausamsten C-Programme :D.


Log in to reply