Ja, so etwas nennt sich "Rückgabeparameter". In C benutzt man das Konzept in der Regel, wenn eine Funktion einen String als Ergebnis liefert. Ein Beispiel ist etwa die Funktion
strcpy(char *destination, const char *source);, die einen String von
source nach
destination kopiert.
|
Source code
|
1
2
3
4
5
6
7
|
int main() {
char buffer[128];
char text[] = "Hallo";
strcpy(buffer, text);
printf("%s\n", buffer); // -> Gibt "Hallo" aus.
}
|
Allerdings ist die Funktion ein schlechtes Beispiel, weil sie nicht weiß, wie groß der der Ziel-Speicherbereich ist.
|
Source code
|
1
2
3
4
5
6
7
8
9
10
11
|
int main() {
char buffer[5];
char text[] = "Hallooooooooooooooooooooooooooooooooooooo";
// Die folgende Zeile schreibt mehr als 5 Zeichen in das Array buffer.
// Dabei werden eventuell wichtige Daten überschrieben, die im Speicher hinter buffer liegen.
// Im günstigsten Fall kriegst du sofort beim Ausführen einen Segmentation Fault,
// im schlechtesten Fall läuft das Programm weiter und liefert falsche Ergebnisse.
strcpy(buffer, text);
printf("%s\n", buffer); // -> Gibt irgendetwas aus und/oder stürzt ab
}
|
Besser ist es deshalb, die Größe des Buffers mit anzugeben, wie zum Beispiel bei der Funktion
strncpy(char *destination, const char *source, size_t num);, wo der Parameter
num die maximale Anzahl an Zeichen angibt, die im Ziel-Buffer gespeichert werden können. Zum Beispiel so:
|
Source code
|
1
2
3
4
5
6
7
8
9
|
int main() {
char buffer[5];
char text[] = "Hallooooooooooooooooooooooooooooooooooooo";
strncpy(buffer, text, sizeof(buffer)); // maximal 5 Byte kopieren
buffer[sizeof(buffer)-1] = '\0'; // String-Ende-Marker setzen.
printf("%s\n", buffer); // -> gibt "Hall" aus
}
|
Analog kannst du dir eine Funktion
void nameEinlesen(char *name, int num) definieren, die den Namen von der Konsole einliest und in der übergebenen Variable
name abspeichert. Quasi so:
|
Source code
|
1
2
3
4
5
6
7
8
|
int main() {
char dateiname[128];
nameEinlesen(dateiname, sizeof(dateiname));
dateiname[sizeof(dateiname)-1] = '\0'; // String-Ende-Marker setzen (unnötig, wenn sich nameEinlesen schon darum kümmert)
dateiAuslesen(dateiname);
}
|