Zeichen aus der Zeichenkette herauslöschen



  • void 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'; //  //
     }
    

    Die Frage ist jetzt, wie ich den Wert der Funktion ausgeben kann. Wie muss also der Quellcode im Hauptprogramm sein ?



  • ich versteh die Frage nicht. meinst du einen return-typ?



  • Die Funktion, wie sie da steht ist schon richtig, aber ich hab net so den Dreh raus, wie ich im Hauptprogramm genau diese Funktion anspreche bzw nutze.

    Aufgabe des gesamten Programms soll sein:
    - Schreiben sie ein Programm, das jedes Zeichen aus s1 entfernt, das in der Zeichenkette s2 vorkommt.



  • Soweit hab ich jetzt das Programm geschrieben, aber er zeigt mir Syntaxfehler im Hauptprogramm an.

    #include <stdio.h>
    #include <ctype.h>
    // Squeeze gibt keinen Wert zurück, sondern wird nur als reine Rechenfunktion genutzt //
    void squeeze(char s1[], char s2[]);
    
    int main(void)
    {
      int Eingabe1, Eingabe2;
      int s1, s2;
      printf("Gib bitte den 1. Wert ein.\n");
        scanf("%g",&s1);
      printf("Gib bitte den 2. Wert ein.\n");
        scanf("%g",&s2);
      if (s1 >= 'A' && s1 <= 'Z')
        if (s2 >= 'A' && s2 <= 'Z')
      squeeze; // Initialisierung der Umkehrungsfunktion //
      printf("%d %d\n", s1, s2); // Ausgabe der Werte aus squeeze //
      return 0;
    }
    
    // Squeeze vergleicht zwei Zahlenketten miteinander und schmeißt übereinanstimmende Zeichen raus //
    void 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'; //  //
    }
    


  • cHillb3rT schrieb:

    Soweit hab ich jetzt das Programm geschrieben, aber er zeigt mir Syntaxfehler im Hauptprogramm an.

    #include <stdio.h>
    #include <ctype.h>
    // Squeeze gibt keinen Wert zurück, sondern wird nur als reine Rechenfunktion genutzt //
    void squeeze(char s1[], char s2[]);
    
    int main(void)
    {
      int Eingabe1, Eingabe2;
      int s1, s2;
      printf("Gib bitte den 1. Wert ein.\n");
        scanf("%g",&s1);
      printf("Gib bitte den 2. Wert ein.\n");
        scanf("%g",&s2);
      if (s1 >= 'A' && s1 <= 'Z')
        if (s2 >= 'A' && s2 <= 'Z')
      squeeze; // Initialisierung der Umkehrungsfunktion //
      printf("%d %d\n", s1, s2); // Ausgabe der Werte aus squeeze //
      return 0;
    }
    
    // Squeeze vergleicht zwei Zahlenketten miteinander und schmeißt übereinanstimmende Zeichen raus //
    void 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'; //  //
    }
    

    Wenn du die Funktion squeeze() aufrufst, solltest du das auch richtig tun.

    Schreib mal:

    squeeze(/*hier Übergabeparameter einsetzen*/);
    

    Das Problem ist, das du in der Funktion 2 char-arrays erwartest, in der main-loop aber kein array definiert hast



  • 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?


Anmelden zum Antworten