Strings mixen



  • Hallo Community,

    ich muss für das Studium ein Programm schreiben welche zwei Strings einliest und dann gemixt ausgibt. Ist das eine Wort kürzer als das andere wird mit dem längeren Wort aufgefüllt. Das Ergebnis muss nicht zwingend in einem String stehen. Nur in der Console. Und es sollen nur die Bibliotheken string.h und stdio.h verwendet werden.
    Bsp.: String1 = Ja, String2 = Nein; => String3 = JNaein;

    Nun ich und ein paar andere Studenten haben jetzt schon mehrere Ideen durch doch jede scheiterte.
    1. String1 an i-ter Stelle ausgeben, dann String2 an i-ter Stelle ausgeben. Mit for-Schöleife das i um eins iterieren. Problem, das nach dem '\O' irgendwelche Symbole stehen und ausgegeben werden.
    2. Ermitteln welcher String kürzer ist, dann diesen in einen neuen String einspeisen und immer ein Feld PLatz lassen, dann mit dem anderen String auffüllen. Unser Ergebnis: Entweder es kommt gar nichts raus 😡 oder auch nur ein Teil bzw. auch andere Symbole.
    3. Auch eine Idee war es mal mittels forschleife das i zu iterieren wie bei 1. nur noch mit if und while-Schleife zu checken ob ein String eben != '\0' ist und nur dann den Wert ausgeben. Da wurde uns alles so gemacht wie es verlangt wird, jedoch wenn der kürzere String zu Ende ist, endet das Programm.

    Wäre echt nett wenn jemand einen funktionieren Code reinstellen könnte, evtl auch weshalb unserer nicht funktionierte usw.

    #include <stdio.h>
    #include <string.h>
    const int MAX = 31;
    
    void mix(char string1[], char string2[]){
    	   int length1 = strlen(string1);
    	   int length2 = strlen(string2);
    	   char result[2*MAX];
    	   int i, j;
    
    	/*
    	  *String1 kürzer/gleich wie String2
    	  *Schreibe String2 in den Array
    	  *Fülle Array mit String1 auf
            */
    	   if(length1 <= length2){
    		i = 0; j = 0;
    		while(string1[i] != '\0'){
    			result[j] = string1[i];
    			i++; j += 2;
    		}
    		i = 0; j = 1;
    		while(string2[i] != '\0'){
    			result[j] = string2[i];
    			i++; j += 2;
    		}
    	   }
    
                    /*
    	   	  *String2 kürzer wie String1
    	   	  *Schreibe String1 in den Array
    	   	  *Fülle Array mit String2 auf
                    */
    	   else{
       		i = 0; j = 1;
       		while(string2[i] != '\0'){
      			result[j] = string2[i];
       			i++; j += 2;
        		}
       	   i = 0; j = 0;
       	   while(string1[j] != '\0'){
       		   if(result[i] == 0){
       			   result[i] = string1[j];
       			   j++;
       		   }
       		   i++;
       	   }
    	 }
       printf("%s", result);
    
    		/*for(int i=0; i < MAX; i++ ){
    
    			while(i <= length1+1){
    				printf("%c", string1[i]);
    				break;
    			}
    			while(i <= length2+1){
    				printf("%c", string2[i]);
    				break;
    			}
    	   }*/
    }
    
    int main(){
    	  char string1[MAX];
    	  char string2[MAX];
    
    	  printf("Geben Sie nacheinander zwei Woerter ein: \n");
    	  scanf("%30s", &string1[0]);
    	  scanf("%30s", &string2[0]);
    
    	  mix(string1, string2);
    
    	  return 0;
    }
    

    thx
    mfg werdas34



  • Was soll "result[i] == 0"?
    der result-String muß auch nullterminiert werden, wenn er mit printf() ausgegeben werden soll, sonst folgen die "kryptischen Zeichen" am Ende 😉
    man kann auch am den result-String am Anfang mit Nullen füllen.

    memset(result,0,sizeof(result));
    

    dann würde auch "result[i] == 0" Sinn machen.



  • Was soll der Nonsens mit der Rumrechnerei?
    Wenn string1 kürzer ist als string2 (das habt ihr ja schon), gebt ihr den string1 direkt gefolgt von string2 aus (mit printf), sonst andersherum.



  • werdas34 schrieb:

    1. String1 an i-ter Stelle ausgeben, dann String2 an i-ter Stelle ausgeben.

    Da wäre sinnvoll, den String2 an j-ter Stelle ausgeben. i bzw j werden nur erhöht (und das Zeichen ausgegeben), wenn das Stringende noch nicht erreicht wurde.
    Ende ist, wenn beide Stringenden ereicht wurden.

    werdas34 schrieb:

    3. Auch eine Idee war es mal mittels forschleife das i zu iterieren wie bei 1. nur noch mit if und while-Schleife zu checken ob ein String eben != '\0' ist und nur dann den Wert ausgeben. Da wurde uns alles so gemacht wie es verlangt wird, jedoch wenn der kürzere String zu Ende ist, endet das Programm.

    Dann braucht ihr doch nur noch die Reststrings ab der i-ten Stelle ausgeben.
    (der eine Restring ist eh leer)



  • Danke euch drei. Bin jetzt schon etwas weiter.

    Dennoch verstehe ich nicht warum die Funktion früher aufhört. Zumindest die Logik macht mir da Schwierigkeiten.

    Ergebnis ist, dass es bis zum kürzeren String richtig ausgebeben wird.

    void mix(char string1[], char string2[]){
           char result[2*MAX];
           int k, i = 0, j = 0, l = 0;
    
            for(k=0; k<2*MAX; k++){
            while(string1[i] != '0'){
                result[l] = string1[i];
                i++;l++;
                break;
            }
            while(string2[j] != '0'){
                result[l] = string2[j];
                j++;l++;
                break;
            }
        }
      printf("%s", result);
    }
    

    Also die for-Schleife durchläuft die MAXimale Eingabe. Sie kann nicht früher stoppen. Ist String1 an i-ter Stelle != *\0' dann gehe in die Schleife setze den Wert an der l-ten Stelle in result ein(i und l zum Anfangszeitpunkt = 0). Iteriere i und l. Gehe in die Zweite Schleife, mache dasselbe nur das l=1 und j=0 sind. Dann iteriere j und l.

    Also meiner Auffassung nach, wenn der eine String kürzer ist als der andere muss die for-Schleife komplett durchlaufen werden, oder? Eigentlich schon!
    Wenn der kürzere String bei != '\0' ankommt, geht dieser nicht mehr in die Schleife rein und kommt auch im zukünftigen Verlauf der For-Schleife nicht mehr rein, da die demenstprechende Variable (i/j) nicht geändert wird. Dennoch wird solange die zweite Schleife ausgeführt und am Ende sollte dann der richtige String rauskommen den ich erwarte. Notfalls noch mit i+j+1-ster Stelle manuell '\0' setzen.

    Wieso stoppt sie vorher? Ich sehe keinen Grund dafür.
    Vorallem finde ich den Code recht schön, da der er kurz ist und man nicht die Länge dauernd abgleichen müsste.

    thx
    mfg werdas34



  • Wenn dein Beispiel
    String1 = Ja, String2 = Nein; => String3 = JNaein;
    so richtig geschrieben ist, dann sollst du eben nicht beide Zeichenketten hintereinanderhängen, sondern (wie der Funktionsname auch schon sagt) mixen.
    String1 = Nein, String2 = Ja; => String3 = NJeain;

    Nur mal heruntergeschrieben (mit direkter Ausgabe):

    void mix(const char* string1, const char* string2)
    {
        for(;;)
        {
            if(*string1) // if(*string1!='\0')
                putchar(*string1++); // -> putchar(*string1);++string1;
            if(*string2) // if(*string2!='\0')
                putchar(*string2++); // -> putchar(*string2);++string2;
            if(!*string1 && !*string2) // if(*string1=='\0' && *string2=='\0'))
                break;
        }
        putchar('\n');
    }
    

    Die verkürzenden Schreibweisen sind wichtig, sehr verbreitet und mit etwas Übung auch schneller zu erfassen.



  • Wenn dein Beispiel
    String1 = Ja, String2 = Nein; => String3 = JNaein;
    so richtig geschrieben ist, dann sollst du eben nicht beide Zeichenketten hintereinanderhängen, sondern (wie der Funktionsname auch schon sagt) mixen.
    String1 = Nein, String2 = Ja; => String3 = NJeain;

    Ich verstehe nicht ganz was du mir damit sagen möchtest. Meinst du ich sollte beide String3 Ergebnisse ausgeben?
    Das wird aber nicht vom Professor erwartet. Man soll nur die eine Eingabe und die andere Eingabe buchstabenweise versetzt ausgeben.
    Ist String1 = Nein, String2 = Ja;, dann sollte => String3 = NJeain; rauskommen.
    Gebe ich es andersherum ein, dann eben die andere Lösung.
    Es ist sogar nicht mal notwendig das in einem String zu speicheren (sicher empfehlenswert), es sollte nur in der Konsole der gemixte Wortlaut stehen.
    Wie, ist eigentlich egal, solange man es erklären kann warum es funktioniert und nicht total fremde Funktionen genutzt werden, ist es dem Professor glecih.

    Sorry, falls du was anderes meintest. 🙂

    Und bei deinem Code:
    Ich kenne die putchar Funktion nicht (sind erst am Anfang von C :)), aber deine Idee ist nicht schlecht. Ich werde sie definitiv testen und bei Fragen auf euch zukommen.
    PS.: Genauso wie ich gerne die Logik bei meinem letzten Code-Beispiel verstehen würde. 🙂



  • werdas34 schrieb:

    Ich kenne die putchar Funktion nicht (sind erst am Anfang von C :))

    putchar gibt ein Zeichen auf stdout aus.

    Etwas komplizierter gechrieben hast du es ja schon benutzt: printf("%c", ...);
    Allerdings muss printf erst noch den Formatstring auswerten.



  • ich muss für das Studium ein Programm schreiben welche zwei Strings einliest und dann gemixt ausgibt. Ist das eine Wort kürzer als das andere wird mit dem längeren Wort aufgefüllt.

    Ich wollte nur schreiben, dass nicht ganz klar ist, wie das "Mixen" oder "Auffüllen" genau funktionieren soll. Meiner Meinung nach passen die beiden Wörter auch nicht zusammen:

    Pseudo
    String1 = "Ja", String2 = "Nein"
    Mixen, jeweils ein Zeichen ausgeben
    String1[0]
    String2[0]
    String1[1]
    String2[1]
    String2[2]
    ...
    String2[N-1]
    Ausgabe "JNaein"
    
    String1 = "Nein", String2 = "Ja"
    Mixen unabhängig der Länge, jeweils ein Zeichen ausgeben
    String1[0]
    String2[0]
    String1[1]
    String2[1]
    String1[2]
    ...
    String1[N-1]
    Ausgabe "NJeain"
    Mixen abhängig von der Länge, mit dem kürzeren String anfangen
    Ausgabe wie oben "JNaein"
    

    Das "Auffüllen" ist mMn widersprüchlich zum "Mixen" wie oben, da immer in "einem Rutsch" aufgefüllt wird. Es gäbe auch mehrere Möglichkeiten.

    Pseudo
    String1 = "Ja", String2 = "Nein"
    Ausgabe "JaNein"
    ODER
    Ausgabe "JNeina"
    
    String1 = "Jaa", String2 = "Nein"
    Ausgabe "JaaNein"
    ODER
    Ausgabe "JaNeina"
    ODER
    Ausgabe "JNeinaa"
    

    Ich denke, dass nur das Mixen gemeint ist (ob jetzt von der Zeichenkettenlänge abgängig oder nicht, wie bei Codepad beschrieben), wenn das Wort "Auffüllen" jedoch wirklich in der Aufgabenstellung vorkommt, dann ist diese meiner Meinung nach zumindest nicht glücklich formuliert. Oder ich habe ein merkwürdiges Sprachempfinden, was natürlich auch sein kann.



  • fsfsf schrieb:

    ich muss für das Studium ein Programm schreiben welche zwei Strings einliest und dann gemixt ausgibt. Ist das eine Wort kürzer als das andere wird mit dem längeren Wort aufgefüllt.

    Ich wollte nur schreiben, dass nicht ganz klar ist, wie das "Mixen" oder "Auffüllen" genau funktionieren soll. Meiner Meinung nach passen die beiden Wörter auch nicht zusammen:

    Mixen kannst du nur, solange du Zeichen in String1 und String2 hast.
    Wenn ein String kürzer ist, kannst du a) aufhören oder b) den Rest vom längeren String dahinter ausgeben (auffüllen)
    In dem Beispiel also das "in" vom "Nein"



  • Hier die Aufgabe vom Professor:

    String Mixer
    Implementieren Sie ein Programm, das zwei Strings einliest und deren „Mix“
    ausgibt. Der Mix von zwei Strings a und b besteht aus dem ersten Zeichen von a
    gefolgt vom ersten Zeichen von b, gefolgt vom zweiten von a, dann dem zweiten
    von b usw. und eventuell überzähligen Zeichen am Ende.

    In den Vorlesungen hat er dann betont, dass am Ende wenn noch überflüssige Zeichen sind, diese einfach hinten aufgefüllt werden. Dazu hat er mehrere Beispiele, die es genauso belegen wie ich es genannt hatte.

    fsfsf schrieb:

    ich muss für das Studium ein Programm schreiben welche zwei Strings einliest und dann gemixt ausgibt. Ist das eine Wort kürzer als das andere wird mit dem längeren Wort aufgefüllt.

    Ich wollte nur schreiben, dass nicht ganz klar ist, wie das "Mixen" oder "Auffüllen" genau funktionieren soll. Meiner Meinung nach passen die beiden Wörter auch nicht zusammen:

    Wenn ich mich nicht täusche, stammt dies aus einer meiner Erklärungen für die gescheiterten Ansätze. Dort war gemeint den kürzeren String in einem anderen String aufzubrechen und dann die Zwischenräume aufzufüllen mit dem längeren.

    String1 = Jaa;
    String2 = Nein;
    
    //Ja ist kürzer also aufbrechen
    String3 = J _ a _ a;
    //Nun mit längerem auffüllen
    String3 = J N a e a i n;
    

    DirkB schrieb:

    Mixen kannst du nur, solange du Zeichen in String1 und String2 hast.
    Wenn ein String kürzer ist, kannst du a) aufhören oder b) den Rest vom längeren String dahinter ausgeben (auffüllen)
    In dem Beispiel also das "in" vom "Nein"

    Bezieht sich, das auf meine vorherige Frage mit der meiner Meinung nach schwierigen Lösung? Denn dennoch ist die Logik eine andere. Außer ich verstehe sie nicht 😕



  • Du bist nicht in der Lage, deine "Aufgabenstellung" zu begreifen, weil du sie nicht erklären kannst.
    Du bist nicht in der Lage, Hinweise, die aufgrund deiner obskuren Beschreibung entstanden, zu begreifen.
    Und der Abgabetermin deiner Hausaufgaben rückt näher.
    Meinst du nicht, dass dich diese Aufgabe und das Einholen von Hilfe für deine Aufgabe überfordert?
    Wer soll dir deine Hausaufgaben machen, wenn du selbst nicht mal in der Lage bist, sie zweifelsfrei darzulegen?
    Wer sollte sich Zeit nehmen, Ordnung in dein Chaos zu bringen?


Anmelden zum Antworten