Kommandozeilenprogramm in C++



  • Ich habe einen Algorithmus geschrieben, der einen String umdreht. Nun soll ich daraus ein Kommandozeilenprogramm entwickeln, das sich mit diesen Parametern steuern lässt. Ich möchte also über die Eingabeaufforderung ein Wort eingeben, welches umgedreht werden soll.
    Kann mir vielleicht jemand sagen, wo im folgenden Quelltext der Fehler ist?
    Das Problem muss in dr main -Fkt sein..

    # include <stdio.h>
    # include <string.h>
    
    int StringLaenge(string) 
    {
       int laenge=0;
       laenge = strlen(string);
       return laenge;
    
    }
    
    char* StringUmdrehen(char string[81],int laenge)
    {
    	int i;
    	int j=0;
    	char *pszstring;
    	char *psztemp;
    	char stringtemp[81];
    
        strcpy(stringtemp, string);
        pszstring=string;
    	psztemp=stringtemp;
    
    	for (i = laenge-1; i >= 0; i--)
    
    	{
        *(pszstring+j)=*(psztemp+i);
        j++;
    
        }
        return stringtemp;
    }
    
    int main (int iArg, char *AszArg[]) 
    {
        int iIndex = 0;
    
    	if (iArg<1) return 1;
    
    	while (iIndex<iArg)
    	{
    	printf("\n%i",iArg);
    
    	printf("\n%s",StringUmdrehen(AszArg[iIndex],iArg));
    
    	printf("\n%s",AszArg);
    
    	iIndex++;
    
    	}
    


  • Erstens: sAszArg ist ein Array von Strings - da hast du vermutlich den Index-Operator vergessen:

    printf("\n%s",AszArg[iIndex]);
    

    Zweitens: Der zweite Parameter deiner Umkehren-Funktion ist die LÄNGE des umzukehrenden Strings, nicht die Länge des argv-Arrays - die mußt du per strlen() berechnen.
    (btw würde ich die Länge sowieso in der Funktion selber berechnen)

    Drittens: Du gibst einen Pointer auf ein lokales Array zurück - dessen Speicherberech dürfte vom nächsten Funktionsaufruf (printf()) schon wieder neu genutzt werden.

    Viertens: Wenn du schon mit C++ arbeitest, kannst du auch dessen Neuerungen verwenden: std::string, cout, std::reverse(),...



  • printf("\n%s",AszArg);
    

    AszArg ist ein Array von Zeigern auf Strings
    also:

    printf("\n%s",AszArg[iIndex]);
    


  • Leider darf ich die Neuerungen nicht verwenden. Das ist in der Aufgabenstellung untersagt.
    Werde jetzt erstmal schauen, was sich mit den Verbesserungsvorschlägen anfangen kann. Danke erstmal!



  • dann bist du vielleicht besser im C Unterforum aufgehoben



  • Ok. Merk ich mir, falls ich mal wieder was zu fragen habe..

    # include <stdio.h>
    # include <string.h>
    
    int StringLaenge(string) 
    {
       int laenge=0;
       laenge = strlen(string);
       return laenge;
    
    }
    
    char* StringUmdrehen(char string[81],int laenge)
    {
    	int i;
    	int j=0;
    	char *pszstring;
    	char *psztemp;
    	char stringtemp[81];
    
        strcpy(stringtemp, string);
        pszstring=string;
    	psztemp=stringtemp;
    
    	for (i = laenge-1; i >= 0; i--)
    
    	{
        *(pszstring+j)=*(psztemp+i);
        j++;
    
    }
        return stringtemp;
    }
    
    int main (void) 
    {
    	char szString[81]= "Software Engineering";
        int iLaenge=0;
    
    	iLaenge=StringLaenge(szString);
    
    	printf("\n%i",iLaenge);
    
    	printf("\n%s",StringUmdrehen(szString,iLaenge));
    
    	printf("\n%s",szString);
    
    	return 0;
    }
    

    Wie lässt sich das mit dem Zeiger meistern? (Pkt. 3)
    Wäre nett, wenn ich noch ne "kleine" Hilfestellung kriegen würd..



  • Anouk schrieb:

    Wie lässt sich das mit dem Zeiger meistern? (Pkt. 3)

    a) Statische Variable verwenden (die bleibt auch nach Ende der Funktion gültig).

    char* StringUmdrehen(char string[81],int laenge)
    {
        int i;
        int j=0;
        static char stringtemp[81];
        ...
    }
    

    b) Speicher per malloc() reservieren (und im Hauptprogramm per free() wieder freigeben)

    char* StringUmdrehen(char string[81],int laenge)
    {
        int i;
        int j=0;
        char* stringtemp = malloc(laenge+1);
        ...
    }
    
    //in main()
    char* res = StringUmdrehen(text,len);
    printf("%s",res);
    free(res);
    

    c) Zielpuffer vom Hauptprogramm übergeben lassen

    char* StringUmdrehen(char string[81],char result[81],int laenge)
    {
        int i;
        int j=0;
        ...
        //anstelle von 'stringtemp' 'result' verwenden
        return result;
    }
    
    //in main()
    char buffer[81];
    printf("%s",StringUmdrehen(text,buffer,len);
    


  • Weshalb dreht ermir nur die ersten beiden Buchstaben um?
    Das kann ja jetzt nicht mehr am stringtemp liegen oder?



  • Was für einen Wert übergibst du denn als 'laenge' an deine Funktion?
    (btw bin ich immer noch der Meinung, daß die Funktion die Länge auch selber berechnen könnte)



  • Na er errechnet doch selbst unter dem Unterprogramm StringLaenge die Länge des Strings, den der Anwender in der Eingabeaufforderung eingibt...

    # include <stdio.h>
    # include <string.h>
    
    int StringLaenge(string) 
    {
       int laenge=0;
       laenge = strlen(string);
       return laenge;
    
    }
    
    char* StringUmdrehen(char string[81],int laenge)
    {
    	int i;
    	int j=0;
    	char *pszstring;
    	char *psztemp;
    	static char stringtemp[81];
    
        strcpy(stringtemp, string);
        pszstring=string;
    	psztemp=stringtemp;
    
    	for (i = laenge-1; i >= 0; i--)
    
    	{
        *(pszstring+j)=*(psztemp+i);
        j++;
    
        }
        return stringtemp;
    }
    
    int main (int iArg, char *AszArg[]) 
    {
        int iIndex = 0;
        int iLaenge=0;
    
    	if (iArg<1) return 1;
    
    	while (iIndex<iArg)
    	{
    	iLaenge=StringLaenge(AszArg);
        printf("\n%i",iLaenge);
    
    	printf("\n%s",StringUmdrehen(AszArg[iIndex],iArg));
    
    	printf("\n%s",AszArg[iIndex]);
    
    	iIndex++;
    
    	}
    }
    


  • Ja, du BERECHNEST die Stringlänge, aber davon bemerkt die Umkehren-Funktion nichts mehr - die bekommt als zweiten Parameter iArg (die Anzahl der Kommando-Parameter) und nicht iLaenge.

    PS: Warum eigentlich nicht so?

    char* StringUmkehren(char str[81])
    {
      int laenge = strlen(str);
      ...
    }
    

Anmelden zum Antworten