Zeichen aus der Zeichenkette herauslöschen



  • Ich hab mir überlegt, dass es eigentlich so gegen müßte. Das Programm wird compiliert, aber es wird mir kein Wert ausgegeben, der die neue Zeichenkette ausgibt.

    #include <stdio.h>
    
    #define MAXLINE 1000
    // Squeeze gibt keinen Wert zurück, sondern wird nur als reine Rechenfunktion genutzt //
    int squeeze(char s1[], char s2[]);
    
    int main(void)
    {
      int Ergebnis;
      char Eingabe1[MAXLINE];
      char Eingabe2[MAXLINE];
      printf("Gib bitte den 1. Wert ein.\n");
      scanf("%g",&Eingabe1);
      printf("Gib bitte den 2. Wert ein.\n");
      scanf("%g",&Eingabe2);
      printf("Hier steht das Ergebnis%d %d\n", squeeze(Eingabe1, Eingabe2)); // Ausgabe der Werte aus squeeze //
      return 0;
    }
    
    // Squeeze vergleicht zwei Zahlenketten miteinander und schmeißt übereinanstimmende Zeichen raus //
    int squeeze(char s1[], char s2[])
    {
      int i, j, k; // Variablen mit Integertypen //
    
      for (i = k = 0; s1[i] != '\0'; i++) // "i" und "k" werden initialisiert, indem sie den Wert 0 bekommen //
      {
        for (j = 0; s2[i] != '\0' && s2[i] != s1[i]; j++) // Zeile 2 ist ungleich 0 und Zeile 2 ist ungleich Zeile 1 !!!  //
        ;
        if(s2[i] == '\0') // Wenn Zeile 2 gleich 0 ist, dann werden die folgenden Anweisungen ausgeführt //
          s1[k++] = s1[i]; //  //
      }
      s1[k] = '\0'; //  //
      return 0;
    }
    

    Nachdem ich nun auch noch mal die einzelnen Variablen überprüft habe, kann ich sagen, dass die Funktion zwar so stimmt, aber s1[] oder s2[] niemals verändert werden. Sie nehmen nicht mal Werte an.
    Demnach wird die Funktion niemals benutzt. Die Frage, die ich mir jetzt stelle ist: Wie kann ich die Funktion aufrufen, damit sie auch richtig bzw überhaupt abläuft ?



  • So ich muss eine Eingabe mir machen mit der ich Zahlen wie auch Buchstaben eingeben kann.

    printf("Gib bitte den 1. Wert ein.\n");
      scanf("%g",&Eingabe1);
      printf("Gib bitte den 2. Wert ein.\n");
      scanf("%g",&Eingabe2);
    

    Mit dieser Eingabeart geht das nicht und ich hab bisher auch noch kein Mittel gefunden scanf anders einzusetzen. Dennoch ist ja die Frage, die man sich stellen sollte, ob es auch nochmal anders geht interessant.

    Habt ihr eine Idee ? 😕



  • printf("Gib bitte den 1. Wert ein.\n");
    scanf("%i",&Eingabe1);
    printf("Gib bitte den 2. Wert ein.\n");
    scanf("%i",&Eingabe2);
    

    du kannst es mit int machen!!!
    Er speichert dann zwar die Buchstaben als ASCII aber das ist das gleiche!!!

    Bsp.: a = 97
    printf("a"); >ausgabe> a
    printf("%c",97); >ausgabe> a

    MfG



  • Dann bleibt aber die Frage, aber wenn ich eine Zeichenkette mit Zahlen und Buchstaben habe, dann hab ich generell ein Problem, denn die Funktion squeeze:

    int squeeze(char s1[], char s2[])
    {
      int i, j, k; // Variablen mit Integertypen //
    
      for (i = k = 0; s1[i] != '\0'; i++) // "i" und "k" werden initialisiert, indem sie den Wert 0 bekommen //
      {
        for (j = 0; s2[i] != '\0' && s2[i] != s1[i]; j++) // Zeile 2 ist ungleich 0 und Zeile 2 ist ungleich Zeile 1 !!!  //
        ;
        if(s2[i] == '\0') // Wenn Zeile 2 gleich 0 ist, dann werden die folgenden Anweisungen ausgeführt //
          s1[k++] = s1[i]; //  //
      }
      s1[k] = '\0'; //  //
      return 0;
    }
    

    ... erwartet char-Werte. Ich habs auch schon probiert, dass s1 und s2 Integer-Werte sind, jedoch bekomme ich beim Ergebnis immer den Wert null heraus.



  • return 0;
    

    !!!
    Komisch das du immer null geliefert kriegst!!!
    gell??!?!?!? 🤡

    MFG 😃
    Was willst du zurück liefern???



  • Also die Funktion soll die zwei Zeichenketten überprüfen, ob die gleichen Zeichen benutzt werden.
    Dies bedeutet, wenn in Zeichenkette 1 ein Zeichen benutzt wird, was in Zeichenkette 2 auch benutzt wird, dann sollen alle Zeichen aus Zeichenkette 1 gelöscht werden.

    Wenn ich return 0 wegmache, dann bekomme ich einen Zahlenwert jenseits der Million.

    Was mach ich da genau falsch ?!? 😕



  • Wenn ich richtig verstanden hab soll Zeichenkette 1 gelöscht werden wenn irgend ein Zeichen von Zeichenkette 1 auch in Zeichenkette 2 vorkommt???

    for(x=0;x<=ZEICHEN_KETTE_1_GROESSE;x++)
    {
      for(y=0;y<=ZEICHEN_KETTE_2_GROESSE;y++)
      {
         if(zeichen_kette_1[x]==zeichen_kette_2[y])
         {
           for(x=0;x<=ZEICHEN_KETTE_1_GROESSE;x++)
           {
             zeichen_kette_1[x]='\0';
           }
           break;
         }
      }
    }
    

    Etwa so???

    MfG 🙂



  • ich sags mal genauer.....

    Die Zeichen, die in Zeichenkette 2 + 1 gleich sind, sollen aus der Zeichenkette 1 rausgelöscht werden.
    Danach soll diese neue Zeichenkette 1 ausgegeben werden.

    Ich bin immer noch am überlegen, wie ich die Funktion richtig anspreche im Hauptprogramm. Denn ie Funktion funktioniert schon von ihrer Logik her, aber an sich weiß ich sie nicht ganz so recht einzusetzen.

    @ hohesC:
    Haste da in dieser Hinsicht eine Idee ? 😉



  • in der Annahme das Zeichenkette 1 + 2 gleichgross sind
    dabei ist SIZE so gross wie die groesse einer einzelnen Zeichenkette.

    for(x=0;x<=SIZE;x++)
    {
      if(zeichen_kette_1[x]==zeichen_kette_2[x])
      {
        zeichen_kette_1[x]='\0';
      }
    }
    

    Das Checkt jetzt ob Bsp.:
    zeichen_kette_1[3] = zeichen_kette_2[3]
    wenn beide gleich sind überschreibt er mit '\0'!

    MFG



  • hohesC schrieb:

    in der Annahme das Zeichenkette 1 + 2 gleichgross sind
    dabei ist SIZE so gross wie die groesse einer einzelnen Zeichenkette.

    for(x=0;x<=SIZE;x++)
    {
      if(zeichen_kette_1[x]==zeichen_kette_2[x])
      {
        zeichen_kette_1[x]='\0';
      }
    }
    

    Das Checkt jetzt ob Bsp.:
    zeichen_kette_1[3] = zeichen_kette_2[3]
    wenn beide gleich sind überschreibt er mit '\0'!

    MFG

    so bin re...

    Wenn er aber beide Zeichenketten mit '/0' überschreibt, dann löscht er doch deren Inhalt. Dies wäre gerade nicht, was ich erreichen will.



  • Nein das tuts nicht wenn z.B. das zeichen zeichen_kette_1[3] gleich dem von
    zeichen_kette_2[3] ist, überschreibt er bloß zeichen_kette_1[3] mit '\0'!!!
    Teste es doch mal!!!

    MFG 😉



  • #include <stdio.h>
    
    #define SIZE 10
    // Squeeze gibt keinen Wert zurück, sondern wird nur als reine Rechenfunktion genutzt //
    int squeeze(int s1[], int s2[]);
    
    int main() // int main() wird normalerweise benutzt //
    {
      int Ergebnis1, Ergebnis2, Eingabe1, Eingabe2, Ergebnis, x;
      char Zeichen_kette_1[SIZE];
      char Zeichen_kette_2[SIZE];
      for (x = 0; x <= SIZE; x++)
      {
        if (Zeichen_kette_1[x] == Zeichen_kette_2[x])
        {
          Zeichen_kette_1[x] = '\0';
        }
          Ergebnis = squeeze(&Eingabe1, &Eingabe2);
          printf("Hier steht das Ergebnis %d\n", Ergebnis); // Ausgabe der Werte aus squeeze //
      }
    
        printf("\n /-- Die Zahlen sind gleich --/ \n");
    }
    

    so ist das Hauptprogramm nun, aber die Eingabe, um die es mir eigentlich ging, konnte ich immer noch nicht realisieren. Da bräuchte ich noch etwas Hilfe !



  • Moment ich code das ganze Prog. mal geschwind!!!



  • hohesC schrieb:

    Moment ich code das ganze Prog. mal geschwind!!!

    Boah wäre erste Sahne... ich muss nur auch alles verstehen, was es bedeuten soll, weil ich nachher den Kram auch erklären können muss, aber des wird schon möglich sein ! 😉



  • brauchst du die squeeze funktion unbedingt?



  • Sie ist Bestandteil der Aufgabe eigentlich, aber schreib erstmal das Programm, wie du dir das denkst und dann kann man ja sicher noch eine Lösung mit der squeeze-Funktion machen.

    😉



  • #include <stdio.h>
    
    #define SIZE 10
    
    void main()
    {
      char eingabe1[SIZE],eingabe2[SIZE];
    
      int x;
    
      printf("Bitte gib den ersten Wert ein:\n");
      gets(eingabe1);
      printf("Bitte gib den zweiten Wert ein:\n");
      gets(eingabe2);
    
      for(x=0;x<=(SIZE-1);x++) // SIZE-1  Da es ja bei 0 beginnt 0,1,....9  //
      {
        if(eingabe1[x]==eingabe2[x])
        {
          eingabe1[x]=' ';
        }
      }
      for(x=0;x<=(SIZE-1);x++)
      {
        printf("%c",eingabe1[x]);
      }
    }
    


  • Vergiss des vorherige ich hab kapiert was du willst!!!

    #include <stdio.h>
    
    #define SIZE 10
    
    void main()
    {
      char eingabe1[SIZE],eingabe2[SIZE];
    
      int x,y;
    
      for(x=0;x<=(SIZE-1);x++)
      {
        eingabe1[x]='\0';
        eingabe2[x]='\0';
      }
    
      printf("Bitte gib den ersten Wert ein:\n");
      gets(eingabe1);
      printf("Bitte gib den zweiten Wert ein:\n");
      gets(eingabe2);
    
      for(x=0;x<=(SIZE-1);x++) // SIZE-1  Da es ja bei 0 beginnt 0,1,....9  //
      {
        for(y=0;y<=(SIZE-1);y++)
        {
          if(eingabe1[x]==eingabe2[y])
          {
            eingabe1[x]='\0';
          }
        }
      }
      for(x=0;x<=(SIZE-1);x++)
      {
        printf("%c",eingabe1[x]);
      }
    }
    

    TESTE DAS MAL DAS SOLLTE NACH DEINEN VORSTELLUNGEN LAUFEN!!! ⚠

    😃



  • Klappt bisher ganz prima das Programm.

    Aber es gibt noch einige Punkte dran zu bearbeiten, denn an sich muss das Programm:
    - Die Löschung von Zeichen bei gemischten Zeichenketten (derzeit kann ich nur Zeichen aus Ketten löschen, die nur aus Zahlen oder Buchstaben bestehen)
    - Die Funktion "squeeze" muss in das Programm eingebaut werden (Hierbei sind wir wieder bei meinem Grundproblem vom Anfang)

    Aber erstmal danke ich dir hohesC 😉 *g*.
    Gute Sache und gar nicht mal lang vom Quellcode her. Willste mir weiter helfen ?

    Edit 1: Yes die zweite Version funktioniert ebenso gut ;). Meinste wir bekommen zusammen, vielleicht das Programm mit dem squeeze hin. Ist halt etwas aufwendiger denk ich mal, aber an sich verfolgt es ja die gleichen Programmanweisungen.



  • Klar das schaffen wir!!! 😉 👍

    Poste mal die ganze Aufgabe!


Anmelden zum Antworten