Character-Array in Funktion zurückgeben

  • Themenstarter Themenstarter di-five
  • Beginndatum Beginndatum
D

di-five

Hallo,

ich habe ein Problem mit der Rückgabe eines char-arrays in einer Funktion in C.

Hier mal der Code:

C:
#include <stdio.h>
#include <stdlib.h>

char einlesen(int gz[]);

int main()
{
    int gz[20];
    // printf("%i", sizeof(gz) / sizeof(int));
    
    // einlesen(gz);
    printf("%s", einlesen(gz));
}

char einlesen(int gz[])
{
    FILE *datei;
    
    if((datei = fopen("werte3.dat", "r")) == NULL)
    {
        char string[] = "\nFEHLER: Datei konnte nicht geöffnet werden.\n\n";
        // printf("%s", string);
        return string;
        exit(1);
    }
}

Ich habe schon mehrere Möglichkeiten ausprobiert das mit Pointern zu lösen,
aber irgendwie klappt das nicht. Weiß jemand, wie ich das ändern muss,
damit die Funktion das char-Array zurückgibt?

Ich habe schon gesucht, aber leider keine passende Lösung gefunden.

Ich würde mich über Hilfe freuen.

Viele Grüße
di-five
 
Zuletzt bearbeitet von einem Moderator:
1: Im main lieber puts statt printf nehmen

2: In der Funktion NIE einen String hintergeben, dessen Variable in der Funktion deklariert wurde
(Ausser es ist static, ist es bei dir aber nicht)
Da kommen so lustige Sachen zusammen, dass das Programm 99 mal geht und beim hundertsten mal plötzlich abstürzt :-)

Sonst wäre der Prototyp
char *einlesen(int *gz)
gewesen, aber wie gesagt, so was besser nicht machen!

Und noch was: Warum machst du ein exit nach einem return?
Beim return hört du Funktion auf, er kommt da nie zum exit.
 
Zuletzt bearbeitet:
Hi sheel,

erst mal vielen Dank für deine Antwort!

Du hast recht, exit(1) wird nach dem return nicht ausgeführt : P : )

Ok, der Code den du geschrieben hast funktioniert, vielen Dank!

Die Ausgabe mit printf() funktioniert auch, aber ich werde wohl auch puts() verwenden.

Hier das ganze nochmal kurz zusammengefasst:

C:
#include <stdio.h>

char *text(char *TEST)
{
    return TEST;
}

int main()
{
    char string[] = "\nHallo Welt!\n";
    
    puts(text(string));
    // printf("%s", text(string));
    
    return 0;
}

Danke dir
di-five
 
Zuletzt bearbeitet von einem Moderator:
Da es thematisch hier genau dazu passt, versuche ich mal mein Glück, vllt. kann ja jemand meinen Fuß von dem Schlauch heben auf dem ich gerade stehe.

ich möchte via Funktion einen Wert aus der Registry lesen (RegSZ) und diesen Wert als Returnwert wieder heraus geben.

Code:
char *fctBT::fctReadRegistry(char strKeyName[], char *ptrsBuf)
{
	HKEY hKey;
	BOOL bRet = TRUE;
	char strKeyValue;
	LONG lReturn = RegOpenKeyEx(regHKLM,
								_T("bla\\bla"),
								NULL,
								KEY_ALL_ACCESS,
								&hKey);
	if(lReturn != ERROR_SUCCESS) //schlüssel existiert nicht
		return false;
	else
	{
		DWORD dwType;
		DWORD dwSize = 1024;
		lReturn = RegQueryValueExA(hKey,(LPCSTR) strKeyName, NULL, &dwType,(LPBYTE) &strKeyValue, &dwSize);
		if(lReturn == ERROR_SUCCESS)
		{		
			strcpy(ptrsBuf, &strKeyValue);
			return ptrsBuf;
			RegCloseKey(hKey);
		}
		else
		{
			return "0";
		}
	}
	
}

für den aufruf verwende ich folgenden code

Code:
char *sTest;
sTest = "";
sTest = fctReadRegistry("cmd", sTest);

Problem liegt im Moment beim strcpy, ich weiß auch, dass das Problem mit Pointern zusammen hängt, seh aber gerade nicht wie ich es beheben kann.

Grüße
 
Hi.
Code:
char *sTest;
sTest = "";
sTest = fctReadRegistry("cmd", sTest);
Der Code hat schon irgendwie so viele Probleme, das man so richtig gar nicht weiß wo man anfangen, soll da alles irgendwie miteinander zusammenhängt.. :)

1. Stringliterale sind konstant. D.h. es ist ein Fehler ein Stringliteral der Variablen sTest vom Typ "char*" zuzuweisen.

2. Das Stringliteral hat gerademal eine Größe von einem Byte. Da kannst du nichts drin speichern... :(

3. Selbst wenn du jetzt Speicher hättest, kannst du ja gar nicht in der Funktion wissen wieviel Speicher zu Verfügung steht, denn du hast diese Information nicht übergeben.

C++:
char sTest[200]; // reicht für einen String mit 199 Zeichen

fctReadRegistry("cmd", sTest, 200); // String Länge mit übergeben!

Dann sehe ich du gibst in der Funktion false zurück. Das ist ja wohl ein Scherz? ;)

Ich sehe gerade in der Funktion selbst sieht es auch nicht besser aus. Du deklarierst strKeyValue als char? :confused: Du weißt schon, das man da nur 1 einzelnes Zeichen drin speichern kann? Du brauchst doch einen String? :confused:

Schau dir mal den Beispielcode in der MSDN an. Oder such hier im Forum.

Gruß
 
Dann sehe ich du gibst in der Funktion false zurück. Das ist ja wohl ein Scherz? ;)

damn, da hatte ich einfach verdrängt noch was zu ändern, das war so nicht geplant :)

Danke ansonsten für die Hinweise, so geht es, auch wenn ich es gerne dynamischer gesehen hätte. Ich hab die letzte Zeit nur Delphi und C# programmiert, da muss man sich ja bekannter Weise um diesen ganzen Pointerkram nicht kümmern. :rolleyes:
 
damn, da hatte ich einfach verdrängt noch was zu ändern, das war so nicht geplant :)

Danke ansonsten für die Hinweise, so geht es, auch wenn ich es gerne dynamischer gesehen hätte. Ich hab die letzte Zeit nur Delphi und C# programmiert, da muss man sich ja bekannter Weise um diesen ganzen Pointerkram nicht kümmern. :rolleyes:
Hast du dir denn mal die Beispiele angeschaut? Da du ja nicht wissen kannst wieviel Speicher du brauchst ist es sinnvoll die Abfrage 2-stufig zu machen:

1) Aufruf der Funktion mit NULL Zeiger und dwSize = 0 um die benötigte Größe festzustellen. Die steht dann in dwSize drin.

2) Entsprechend Speicher allozieren (malloc oder new[]) und die Funktion nochmal aufrufen.

\edit: Das sollte alles in der fctReadRegistry Methode geschehen. Das Freigeben des Speichers dann von dem Teil des Programmes der die Methode aufgerufen hat. Oder du verwendest gleich einen std::string mit call-by-reference.

Gruß
 
Zuletzt bearbeitet:
Zurück