char Pointer Problem



  • Hallo liebes Forum,

    habe eine Aufgabe von der Schule bekommen und habe sie größtenteils gelöst bis auf eine Kleinigkeit.
    Erst einmal möchte ich die Aufgabe erläutern: Es soll eine Funktion geschrieben werden, die zwei Parameter erwartet: der erste Parameter ist ein Pointer von einem char Array, welches einen Text enthält mit Zeilenumbrüchen. Der zweite Parameter ist ebenso ein Pointer auf ein char Array, worin der Text gespeichert werden soll, jedoch ohne die Zeilenumbrüche ( Zeilenumbrüche sollen durch Blanks ersetzt werden).
    Soweit hab ich alles gemacht, nur das Problem ist, dass er zwei Blanks macht, wenn auch zwei Zeilenumbrüche nacheinander kommen. Wie bekomme ich das in den Griff? Hier mal der Code:

    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /** Prototyp */
    void entferne( char*, char* );
    
    /** MAIN */
    int main(int argc, char* argv[])
    {
        /** Deklaration und Initialisierung der Variablen */
        char alttext[500] = "Anrede Irgendwas\nTextText\n\nGrussformel";
        char neutext[500] = "";
    
        /** Aufruf der Funktion */
        entferne( alttext, neutext );
    
        /** Beide char[] ausdrucken */
        printf(" %s \n", alttext );
        printf(" %s ", neutext );
        getch();
        return 0;
    }
    
    void entferne( char* _alt, char* _neu ) {
         /** Länge des Textes ermitteln */
         int  len = strlen( _alt );
    
         for ( int i=0;i<len;i++ ) {
             int c = *_alt;
             int c1 = *_alt++;
             printf( "%c \n", c );
             if ( c == 10 || c == 13 ) {
                  /** ---------------
                   *  | PROBLEMKIND |
                   *  --------------- */
                  if ( c1 == 10 || c1 == 13 ) {
                       *_neu = '.';
                  }
                  else {
                       *_neu = ' ';
                  }
             }
             else {
                  *_neu = c;
             }
    
             *_neu++;
         }
         *_neu = '\0';
    }
    

    Wäre echt super, wenn ihr mir aus der Sackgasse helfen könntet 🙂

    Viele Grüße

    -- kirsche 🙂



  • Du könntest danach nochmal durch den string gehen und alle doppelten blanks durch ein einfaches blank ersetzen. Diese Methode ist aber sehr unsauber.

    Eine andere Möglichkeit ist, wenn du beim ersetzen der \n einfach abprüfst ob davor oder danach schon ein blank ist

    mfg
    Horst



  • Kleiner Hack:

    int main() {
      char a[] = "AB\nC\n\nDE\n\n\n\n\n\nFG\nE";
      char b[300];
      replace(a,b);
    
      cout << "a=" << a << endl;
      cout << "b=" << b << endl;
      int i;
      cin >> i;
    }
    
    void replace(char* str1, char* str2) {
       int i,j;
       for(i=0, j=0; str1[i]; i++) {
          if(str1[i] == '\n') {
             if(i>0 && str1[i-1] != '\n')
                str2[j++] = ' ';}
          else
             str2[j++] = str1[i];
       }
       str2[j] = 0;
    }
    


  • Oder in der Haxx0r-Deluxe Version: 😉

    void replace(char* str1, char* str2) {
       int i,j;
       for(i=0, j=0;str1[i];str1[i]=='\n'?i>0&&str1[i-1]!='\n'?str2[j++]=' ':i=i:str2[j++]=str1[i],i++);  
       str2[j] = 0;
    }
    


  • bisschen unübersichtlich, aber wer's braucht 😃



  • Hallo Leute,

    vielen Dank für Eure Hilfe. Es funktioniert jetzt. Hab aber ehrlich gesagt erst einmal richtig überlegen müssen, bis ich es verstanden habe 🙂

    Gruß
    kirsche


Log in to reply