Verwendung von strtok



  • Hallo zusammen ich hab mal eine Frage unzwar soll ich folgende Aufgabe lösen

    Schreiben Sie ein C-Programm, welches den
    Text einer Kopfzeile von C-Funktionen analysiert.
    Der Text der Kopfzeile soll als Zeichenkette eingegeben werden und untersucht werden. Als Ergebnis soll das Programm
    den Namen der Funktion, die Zahl der Parameter und die Parameternamen
    bestimmen.
    Beispiel:
    Für den Funktionsaufruf funk(a1,b1,u) soll folgende Ausgabe erzeugt werden:
    Name der Funktion: funk
    1.Parameter: a1
    2.Parameter: b1
    3.Parameter: u
    Zahl der Parameter: 3
    Hinweis:
    Da die Funktion scanf als Datentrennzeichen das Leerzeichen verwendet, eignet sich diese Funktion nicht zum Eingeben von Zeichenketten, welche auch Leerzeichen enthalten dürfen. Deshalb soll die Funktion gets
    verwendet werden, die eine Eingabezeile in eine Zeichenkette schreibt.

    Weiß nur das eine strtok funktion ungefähr so aussehen soll

    #include <stdio.h>
    #include <string.h>

    int main ()
    {
    char str[] ="Test(a,b,c).";
    char * pch;
    printf ("Splitting string \"%s\" into tokens:\n",str);
    pch = strtok (str," ,.-");
    while (pch != NULL)
    {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
    }
    return 0;
    }

    Leider bin ich immer noch nicht wirklich clever in Programmierung.
    Kann mir wer helfen??
    MfG



  • #include <stdio.h>
    #include <string.h>
    
    void removeWhiteSpace(char *s){
    	char *p = s;
    	while(*p){
    		if(*p == ' '){
    			p++;
    		}else{
    			*s++ = *p++;
    		}
    	}
    	*s=0;
    }
    
    int main(void) {
    	char str[] = "funk( a1 ,b 1, u)";
    	removeWhiteSpace(str);
    
    	char *func;
    	int count = 1;
    
    	//extract function name
    	func = strtok(str,"(");
    	printf("Name der Function: %s\n",func);
    	while(func){
    		func = strtok(NULL,")");
    	}
    
    	//extract params
    	func = str+strlen(str)+1;
    	func = strtok(func,",");
    	while(func){
    		printf("%d.Parameter: %s\n",count++,func);
    		func = strtok(NULL,",");
    	}
    
    	return 0;
    }
    

    versuchs mal damit 😉

    lg lolo



  • noobLolo schrieb:

    char str[] = "funk( a1 ,b 1, u)";

    leerräume in bezeichnern würde ich aber verbieten.
    🙂



  • ja das sieht ja scho ganz gut aus aber ich muss den text frei wählen können.Also nicht zwangsweise funk(a1,b1,c1), sondern diese Fubktion selber eintippen.
    So das der Ausgabetext ungefähr so aus sieht.

    funk(a1,b1,c1)
    Name der Funktion: funk
    1. Parameter: a1
    2. Parameter: b1
    3. Parameter: c1
    Zahl der Parameter: 3
    Drücken Sie eine beliebige Taste . . .

    MfG



  • eigentlich schaut das ganz miserabel aus, erstens das problem das ;fricky beschrieb, zweitens geht sowas nicht...

    fn(a,fn(),b);
    

    denke da braucht man dann schon fast einen parse tree wo man bei jeder '(' ein level rauf und bei ')' ein level runter geht und bei jedem ',' hängst an den aktuellen knoten ein child dran, dann erübrigt sich das auch mit den whitespace, wenn du am ende die bezeichner durch eine trim() function schickst, evtl. gehts auch recurisv aber da fällt mir jetzt spontan nix ein 😞

    für dein problem mit der eingabe wirfst mal da nen blick rein
    http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

    lg lolo



  • hmm...das natürlich nicht so toll, weil der Prof meinte mit str tok gehts wohl sau einfach. und wenn man nur den text funk(a1,b1,c1) eintippen muss also ein Programm speziell für diese Fubktion? geht das denn irgendwie ohne ein kompliziertes Programm zu schreiben???



  • hm? du hast aber schon mal deinen compiler angeworfen und dich zumindest um die eingabe gekümmert? 🙄



  • Nein ich hatte noch nichts getan weil ich leicht überfordert bin mit dieser Aufgabe.



  • hast schon mal nen blick in den link geworfen? die datei die du verwenden mußt heißt "stdin" die brauchst nicht öffnen sondern kannst sie sofort verwenden, schließen fällt also auch flach 😉

    lg lolo


Anmelden zum Antworten