Problem beim Zerlegen eines Arrays - Gelöst



  • Hallo an alle,

    Ich soll einen Kassenbon Programmieren der folgende Eingabe erlaubt.
    <Artikelnummer> <Blank>+ <Anzahl> <Blank>+ <Preis>

    Die Eingabe wird durch fgets(daten, 255, stdin) ;
    am Terminal oder aus einer Datei ermöglicht. Dieses daten Array
    soll nun durch eine Zerlegenfunktion in 3 neue Arrays Artikelnummer,
    Anzahl und Preis geschrieben werden.

    int zerlegen(char daten[], char ziel[], int maxChars,
    				 int anfangsindex, char trennzeichen)
    {
    	int qi = anfangsindex;
    	int zi= 0 ;
    	char c = '\0';
    	for (qi=anfangsindex; qi<strlen(daten); qi++)
    	{
    		c=daten[qi];
    		if (c==trennzeichen)
    		{
    			ziel[zi]='\0';
    			break;
    		}
    		else
    		{
    			ziel[zi]=c;
    			zi++;
    		};
    		if (zi==maxChars)
    		{
    			ziel[zi-1]='\0';
    		}
    
    	};
    	qi++;
    	return qi; 
    }
    

    Das Trennzeichen soll in diesem Fall das Leerzeichen sein.

    Mein Problem:
    Ich muss die Funktion so umschreiben, das sie mehrere Leerzeiche(Trennzeichen)
    zulässt, eins davon erkennt und die anderen "überliest".
    Hab schon gehört es soll mit einer for-Schleife realisiert werden, aber ich
    komme da im Moment echt nicht weiter.
    Bin Neueinsteiger in C und lerne es erst seid 6 Wochen, deshalb hab ich auch nochnicht so den Durchblick.

    Anmerkung zum jetzigen Zerlegen:
    Wenn ich nun <5> <Blank> <5> <Blank> <5> im Terminal eintippe kommt das gewünschte bei raus: 5 5 5

    Doch wenn ich <5> <Blank> <Blank> <5> <Blank> <5> eingebe, kommt folgendes heraus: 5 0 5
    Scheinbar wird durch das 2. Blank nichts eingelesen und die 3. 5 fällt vom
    Tisch?

    Hoffe ihr könnt mir da helfen das hinzubiegen und ich hoffe das alles gut lesbar ist trotz meines ganzen rumgeschreibes.

    Gruß Kanox



  • Wenn es dich nicht stört, daß der ursprünglich übergebene String unterwegs zerstört wird, wäre strtok() eine Mögichkeit. Andernfalls mußt du deine Schleife so überarbeiten, daß du dir merkst ob das letzte Zeichen ein Trennzeichen war - wenn ja, werden die nächsten Zeichen überlesen.



  • Du musst führende Trennzeichen überlesen.

    for (qi=anfangsindex; qi<strlen(daten); qi++)
    { if (daten[qi]!=trennzeichen)
        break;
    }
    for (; qi<strlen(daten); qi++)
    ... Weiter wie bisher
    


  • Ich danke euch beiden für die hilfreichen und sehr schnellen Antworten!
    Es funktioniert nun mit Dirk's Lösung.

    Wollte es mal mit strtok() testen, aber hab gesehen das man dafür ein Pointer braucht?
    Und für unser kleines Projekt wurden Pointer leider verboten.

    Euch noch ein schönes Wochenende

    Grüße Kanox



  • Kanox schrieb:

    Wollte es mal mit strtok() testen, aber hab gesehen das man dafür ein Pointer braucht?
    Und für unser kleines Projekt wurden Pointer leider verboten.

    Auch wenn es nicht so aussieht - die Parameter deiner Funktion sind in Wirklichkeit auch nur Pointer 😉 In C zerfällt ein Array bei der erstbesten Gelegenheit in einen Zeiger auf das erste Element, so daß man in den meisten Fällen den Unterschied zwischen Arrays und Zeigern nicht bemerkt.


Anmelden zum Antworten