Pointer als Rückgabetyp (Strings)



  • Hey,

    muss für die Uni ein Programm schreiben, das mir eine eingegebene Dezimalzahl in eine Zahl zu einer gewünschten Basis 2,...,36 umrechnet.

    Die Funktion zum Umrechnen soll wie folgt deklariert werden:

    char* basisb(long long n, int b, char* ziffern)
    
    "Das Ergebnis soll als Zeichenkette in einem char-Feld (ziffern) zurückgegeben werden. Geben Sie zur einfacheren Verwendung der Funktion zusätzlich einen Zeiger auf das Feld zurück."
    

    Ich schätze, der Rückgabetyp soll ein pointer sein, weil man keinen kompletten String zurückgeben kann, richtig?

    Meine Frage dazu:
    Was bringt es mir, einen Zeiger zurückzugeben? Ich kann doch gleich im Funktionsrumpf den String mit dem Ergebnis belegen, oder nicht?

    Ein einfaches Beipsiel würde mir auch genügen^^ (habe mit google fast nur Müll dazu gefunden... bzw. nichts was speziell zu strings passt.)

    Hoffe ihr könnt mir etwas auf die Sprünge helfen. 🙂

    MfG
    Simon



  • Damit du mit dem Rückgabewert gleich weiter arbeiten kannst.

    char feld[100];
    ...
    printf("1000 zur Basis 2 ist 0b%s \n", basisb(1000,2,feld));
    

    Das n hat eine interne Darstellung vom Rechner (meist zur Basis 2). Das spielt aber keine Rolle.
    Zur Dezimalzahl wird das erst, wenn du eine Umwandlung zur Basis 10 bei einer Ausgabe machst

    Dann hast du Zeichen, die die Ziffern darstellen.



  • Aber statt

    printf("1000 zur Basis 2 ist 0b%s \n", basisb(1000,2,feld));
    

    müsste es doch

    printf("1000 zur Basis 2 ist 0b%s \n", *basisb(1000,2,feld));
    

    (Funktion dereferenziert) lauten, oder nicht? Sonst gebe ich ja die Adresse aus, auf den der pointer ( = das Ergebnis der Funktion) zeigt, oder?



  • Nein. %s bei printf erwartet einen Zeiger auf einen nullterminertes Speicherbereich.
    Mit dem derefernzieren würdest du nur das eine Zeichen von der Adresse bekommen.

    Schau dir mal die Prototypen der Funktionen aus string.h an. Oder andere Funktionen, die Strings verarbeiten.
    Alle arbeiten mit Zeigern auf char ( char* )



  • Top, danke! Dass %s einen pointer erwartet, sollte man dafür natürlich wissen.. 😃

    Gibt es auch eine Möglichkeit mit printf Zahlen >= 10 als Buchstaben darzustellen? Also ohne %X (brauche ja auch die Basen 17,...,36) ?

    Dachte an

    enum { A = 10, B, ... }
    

    aber das gilt ja nicht für die Ausgabe...

    edit:

    Es kommt bei mir leider nur Kauderwelsch heraus, irgendwelche Zeichen, die man in keinem Schreibprogramm findet (Kann sie noch nichtmal hier reinkopieren...).
    Aber der Code ist doch zumindest für Basen <= 10 schonmal richtig, oder?

    #include <stdio.h>
    
    //Umrechnungsfunktion
    char* basisb(long long n, int b, char* ziffern)
    {
        long long int teil_erg = n,	//speichert den ganzzahligen Teiler
            i;
        char* ptr;
    
        for(i = 0; teil_erg != 0; i++)
        {
    	ptr = &ziffern[i];
    	*ptr = teil_erg % b;		//Rest ermitteln und in ziffern schreiben
    	teil_erg = teil_erg / b;	//ganzzahligen Teiler zur weiteren Rechnung ermitteln
        }
    
        return ziffern;
    }
    
    int main(void)
    {
        int b;	//Basis
        long long int n;	//umzurechnende Zahl
        char ziffern[20];	//long long int maximal 20 Stellen im Dezimalzahlsystem
    
        printf("Welche ganze Dezimalzahl soll umgerechnet werden? ");
        scanf("%Li", &n);
    
        do
        {
    	printf("Zu welcher Basis umrechnen (2...36)? ");
    	scanf("%i", &b);
        } 
        while(b < 2 || b > 36);
    
        printf("%Li = %s(%i)\n", n, basisb(n, b, ziffern), b);
    
        return 0;
    }
    


  • Nein. Das ist ja deine Aufgabe 🙂

    Aber schau mal bei http://www.c-plusplus.net/forum/p2376335#2376335.
    Auch wenn die Frage nach zu Dualzahlen ist, findest du evtl. eine Lösung.

    Überprpüfen kannst du deine Ergebnisse mit strtol


Anmelden zum Antworten