call_by_reference
-
Guten Tag,
ich bräuchte etwas Hilfe, da ich noch nicht so lange mit C arbeite.
Folgende Probleme:Ich möchte an eine Funktion zwei Strings übergeben, die beide von dieser bearbeitet werden.
Nachdem die Funktion dann durchgearbeitet wurde, sollen beide veränderten Werte auch im Hauptprogramm wieder auffindbar sein.
Die Lösung für das Problem sind Pointer....Hier mein Gedankengang:[code]
#include <stdio.h>void my_function1(char *str1, char *str2) {
// str1 und str2 sind nun klassische Pointer.
// Ich hatte gedacht, dass diese beim Aufruf der Funktion auf das nullte Element zeigen müssten, so dass ich dann jedes einzelne Zeichen ablaufen und verändern kann.
// Wie dies funktionieren soll, habe ich allerdings noch nicht richtig herausgefunden.
// Ich wäre für gute Vorschläge sehr dankbar!!
.........
printf("Output: %s\n", str1);
// Wenn man im Hauptprogramm den Wert Null in folgender Zeile erhöht (ptr1 = &text1[0];,
// dann wird an dieser Stelle von dem String von vorne immer entsprechend viele Zeichen abgeschnitten.
// Ich weiß einfach nicht, wie ich dann auf einen einzelnen Buchstaben zugreifen soll.
)
}// ODER
void my_function2(char str1[], char str2[]) {
for (i=10; i<= 40; i++) {
str1[i]="T";
}
// Ist dies wirklich eine call_by_reference Parameter-Übergabe??
// Ich übergebe doch hier ein bzw zwei Zeichenfelder an die Funktion, die dann bearbeitet werden.
// call_by_reference ist doch aber gerade die Übergabe einer Adresse, um dort neue Werte hineinzuschreiben! Bitte korrigiert mich, wenn ich mich irre.
}void main(void) {
char text1[80] = "Ich stehe noch ganz am Anfang...";
char text2[40] = "Mir fiel nichts sinnvolles mehr ein.";
char *ptr1, *ptr2;ptr1 = &text1[0];
ptr2 = &text2[0];my_function1(ptr1, ptr2);
my_function2("Dies ist ein Text", "Noch mehr Text");
}So, das war eine ganze Menge Text. Es wäre sehr freundlich, wenn Ihr mir etwas allgemeines zum Umgang mit Pointern und Strings schreiben könntet.
Vielen Dank für die Hilfe.
MFG, W2K.
-
ptr=&string[0] ist zwar auch ein pointer auf den string .. aber du kannst es dir leichter machen mit prt=string
im unterprogramm kannst du dann den ptr auf den string genauso benutzen wie den ursprünglichen string !
-
Hi,
ich schicke nun einmal mein konkretes Problem mit - ink. der Fehlermeldung:
[cpp]char *g_filename[40];// Erstellt einen Pointer vom Typ char für eine Zeichenkette der Länge 12
// Initialisierung mit *-Operatorvoid getfname(char *l_filename) {
printf("Zieldatei: ");
gets(l_filename);
}void main(void) {
char *ptr;printf("\n-------------------- Durchsuchen einer Textdatei --------------------\n\n");
printf("Mit Hilfe des folgenden Progammes kann eine beliebige Datei geoeffnet werden\nund nach einem bestimmten Ausdruck durchsucht werden.\n\n");ptr=g_filename;
getfname(ptr);
printf(">Ihre Eingabe lautete: <%s>.\n", g_filename);
}Fehlermeldung:
--------------------------------------------------------------------
Main.cpp(37) : error C2440: '=' : 'char *[40]' kann nicht in 'char *' konvertiert werden
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder FunktionsformatP.S.: Das ist aus dem Visual Studio von Microsoft!
-
du musst das gar nicht erst auf einen pointer umleiten .. du kannst einfach direkt g_filename übergeben !
-
W2K schrieb:
Main.cpp(37) : error C2440: '=' : 'char *[40]' kann nicht in 'char *' konvertiert werden
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder FunktionsformatDas ist ein C++ Compiler. Warum programmierst du C?
Lösung für dein Problem: die globale (warum eigentlich global?) Variable als char-Array deklarieren, nicht als Array von char-Pointern:
char g_filename[40];
Und natürlich die obligatorische Warnung: Dein Array hat eine begrenze Größe, aber es gibt keine Möglichkeit, die Größe der Eingabe, die gets liefert, zu begrenzen. Wenn jemand 41 oder mehr Zeichen eingibt, läuft dein Array über. gets vermeiden.
-
Hi,
erst einmal Danke.
Hab den Fehler auch gefunden...Wie kann ich denn die Stringlänge dynamisch machen?
Ich kann dieses my_string[80] gar nicht leiden....
Welche Eingabefunktion würdest Du an meiner Stelle verwenden?Gruß.
-
W2K schrieb:
Welche Eingabefunktion würdest Du an meiner Stelle verwenden?
Das hängt davon ab, ob du weiter C programmieren willst. Wenn ja, dann fgets. Als Parameter werden der entsprechende Zeiger wie bei gets, eine maximale Länge der Eingabe, und ein Eingabestrom erwartet - hier einfach stdin übergeben.
In C++ könntest du dir das ganze sparen, indem du die string-Klasse und die Funktion getline aus der Standardbibliothek verwendest.
-
Ich dachte fgets wird im Zusammenhang mit Datei benutzt?
Bitte beschreibe mir einmal kurz den unterschied zwischen gets, scanf ung fgets bzw fgetc.
P.S. Wieso geht bei meinen Beitragen der Syntax-Highlight nicht?
-
W2K schrieb:
Ich dachte fgets wird im Zusammenhang mit Datei benutzt?
Nicht ganz. fgets wird mit Strömen benutzt. Eine geöffnete Datei ist ein Strom, aber genauso ist sind die Standardein- und -ausgabe Ströme (namens stdin und stdout)
Bitte beschreibe mir einmal kurz den unterschied zwischen gets, scanf ung fgets bzw fgetc.
Warum soll ich dir deine Referenz vorlesen?
P.S. Wieso geht bei meinen Beitragen der Syntax-Highlight nicht?
Du hast das cpp bzw. code-Tag nicht wieder zugemacht.