kostenloser Webspace werbefrei: lima-city


Code Verständnisfrage | Wert von Variable mit Methode ändern

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    ultimate-bravery

    ultimate-bravery hat kostenlosen Webspace.

    Hallo zusammen.

    Ich habe einen C Code, welcher ein String einließt und alle Kleinbuchstaben zu Großbuchstaben umwandelt und dabei zählt, wie oft das der Fall war. Da der Code nicht von mir ist habe ich eine Frage zum Verständnis des Codes.
    Hier erstmal der Code:

    #include <stdio.h>
    
    void einlesen(char s[]) {
    	printf("\nBitte String eingeben:");
    	scanf("%s", s);
    }
    
    int stringLaenge(const char s[]) {
    	int i = 0;
    	while (s[i++]);
    	return (i -1);
    }
    
    int grossSchreiben (char s[]) {
    	int i = 0, anztausch=0;
    	while (s[i]) {
    		if (islower(s[i])) {
    			s[i]=toupper(s[i]);
    			anztausch++;
    		}
    		i++;
    	}
    	return anztausch;
    	}
    
    void main() {
    	const int laenge = 10;
    	int anzahlDreher = 0;
    	char mein[laenge];
    	einlesen(mein);
    	printf("\nDer String %s hat die Laenge %i.", mein,
    	stringLaenge(mein));
    	anzahlDreher = grossSchreiben(mein);
    	printf("\n%s wurde mit %i Drehern erzeugt.\n", mein, anzahlDreher);
    }


    Also im main Teil wird ja sozusagen ein String der Länge 10 erstellt. Wenn man jetzt die Funktion grossSchreiben aufruft, muss man ja diesen String übergeben. In der Funktion heißt dieser String dann ja s. Mit s[...] = toupper(s[...]) wird ja dann das entsprechende Zeichen umgewandelt. Aber das ist doch jetzt erstmal nur innerhalb der Methode so. Ich verstehe nicht, wie diese Änderung jetzt nach außen auf die Variable "mein" übertragen wird. Denn der Rückgabewert ist ja nur die Anzahl der Änderungen. Wie man im letzten Print Befehl sieht, wird dort die Variable "mein" ausgegeben. Und zwar nur mit Großbuchstaben. Aber ich sehe einfach nicht, wie die Drehung auf das "mein" übertragen wird. Für mich ist es nur logisch, dass es nur innerhalb der Methode bei dem "s" umgewandelt wird.

    Ich hoffe ihr versteht was ich meine und könnt mir helfen.
    Viele Grüße
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo ultimate-bravery.

    Die Strings mit denen du arbeitest sind genau genommen char-Arrays. Also Felder aus einzelnen Zeichen. Übergibt man diese an eine Funktion, werden sie als Referenz übergeben. Das heißt, übergeben wird nur die Position im Arbeitsspeicher, wo die Zeichen stehen. Ändert die Funktion die Zeichen, werden die Änderungen dann eben auch für main sichtbar.
    Manchmal ist das vielleicht unerwünscht. Dann muss man das gesamte Array zuerst kopieren, was abhängig von der größe des Arrays recht lang dauern kann. Oft stört es nicht oder ist - wie hier - sogar sinnvoll, keine Kopie zu erstellten. Dann wäre es verschwendee Rechenzeit, das Array zu kopieren. In C++ entscheidet das noch der Programmierer.

    Ich hoffe, das war verständlich genug.
    Viele Grüße
  4. fuerderer schrieb:
    Übergibt man diese an eine Funktion, werden sie als Referenz übergeben. Das heißt, übergeben wird nur die Position im Arbeitsspeicher, wo die Zeichen stehen.

    Streng genommen ist das falsch. Du verwechselt hier Referenzen mit Pointern (Pointers? Zeigern? Wie sagt man das im Deutschen?). Ein Pointer in C zeigt, wie Du sagtest, auf eine Position im Arbeitsspeicher. Diese Position ist damit natürlich auch irgendwo gespeichert und wird bei der Parametergabe kopiert (also call by value). Referenzen im Sinne von C++ gibt es in C nicht. Eine Referenz stellt ein alias für einen Wert da, somit wirkt sich auch das neu erzeugen eines Objektes auf das Objekt in der aufrufenden Funktion aus. Eine genauere Erklärung dazu gibt es hier:
    http://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in

    Des weiteren hoffe ich, dass Du nicht vor hast den scanf Befehl so "produktiv" einzusetzen. Denn überleg mal was passiert, wenn der Benutzer 10 Zeichen oder mehr eingibt: bei genau 10 Zeichen gibt es in "mein" bereits keinen Platz mehr für das Null Byte am Ende. Damit wirst Du solange Zeichen ausgeben/in Großbuchstaben umwandeln, bis im Arbeitsspeicher zufällig ein Null Byte kommt. Noch problematischer wird es aber wenn der Nutzer böse Absichten hat. Dann kann er, in dem er bewusst zu viele Zeichen eingibt, Teile des Arbeitsspeichers überschreiben und somit im "worst case" eigenen Code ausführen (Google mal nach Buffer overflow).
    Google am besten auch mal nach alternativen für scanf, ich kenn mich mit C nicht sonderlich aus und weiß da nicht genau über mögliche alternativen bescheid.

    Beitrag zuletzt geändert: 26.3.2015 0:55:02 von davidlw
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!