Komische Konsolenausgabe

MeeriMomo

Mitglied
Ich versuch emomentan wörter aus einer MySQL Datenbank auszulesen,
was inzwischen auch klappt. Diese kann ich danach auch ausgeben, in dem ich
C:
printf(row[1]);
schreibe. ich wollte das wort jetzt aber als rückgabe wert zurückgeben.
Das klappt aber nicht.
Auf der Konsole werden nur wirre Zeichen ausgegeben.

Mein Code:
My SQL abfrage:
C:
char *mysql_wort_abfrage(char *server, char *user, char *password, char *database, char *table, int zeile)
{
	char sqlquery[100];
	MYSQL *connect;
	MYSQL_ROW row;
	MYSQL_RES *res;
	char *result;
	/* Handle initialisieren */
	connect = mysql_init(NULL);
	if(connect == NULL)
	{
		fprintf(stderr, " Initialisierung fehlgeschlagen\n");
		return "error";
	}
	
	if( mysql_real_connect(connect, server, user, password, database, 0, NULL, 0) == NULL)
	{
		fprintf (stderr, "Fehler mysql_real_connect():""%u (%s)\n",mysql_errno (connect), mysql_error (connect));
		return "error";
	}
	else
	{
		#if defined DEBUG
			printf("Debug: Erfolgreich mit dem MySQL-Server verbunden!\n");
		#endif
		/////////////////////////////////////////////////////////////////////
		
			
		
		/* den Inhalt der SQL Query in eine Variable packen*/
		sprintf(sqlquery, "SELECT * FROM %s WHERE id_%s = %d", table, table, zeile );

		/* die SQL query senden*/
		if (mysql_query(connect, sqlquery))
		{
			fprintf(stderr, "%s\n", mysql_error(connect));
			return "error";
		}

		res = mysql_use_result(connect);
		row = mysql_fetch_row(res);
		if(row != NULL)
		{
			/* die Daten ausgeben (row[1] ist das Attribut in der ersten Spalte, 
			row[2] das Attribut der zweiten Spalte usw.)*/
			printf(row[1]); NL
			sprintf(result, row[1]);
		}
		else
		{
			printf("Fehler.\n"); 
		}
		/* Speicher freigeben und Verbindung trennen */
		mysql_free_result(res);
		/*
		Datenbank arbeit
		*/
		mysql_close (connect);

		#if defined DEBUG
			printf("Debug: Verbindung mit dem MySQL-Server erfolgreich beendet");
		#endif

		return row[1];
	}
}

Funktionsaufruf in der Main:
C:
char *wort;
int main()
{
	wort = mysql_wort_abfrage("Server", "root", "123456", "Wörter", "Nomen", 5);
	printf(wort);
	while(1);
}

Ich hoffe mir kann einer helfen.
 
Hi.

Du gibst dort einen Zeiger auf eine lokale Variable zurück, die nach Verlassen der Funktion weggeräumt wird und somit den Zeiger ungültig werden läßt.

Außerdem rufst du mysql_free_result auf, welche das Resultat inklusive der verwalteten Rows vor Verlassen der Funktion wegräumt.

Du mußt Speicher allozieren und eine Kopie zurückgeben, welche du dann im Hauptprogramm wieder freigeben mußt:
C:
char *mysql_wort_abfrage(char *server, char *user, char *password, char *database, char *table, int zeile)
{
   char*  result;


   result = strdup(row[1]);

   ...

   return result;
}


int main(...) {
   char* word = mysql_wort_abfrage(..);

   ...

   free(word);
}
Gruß
 
Hi.
Traveller hat gesagt.:
Rückgabe von Pointern ist böse.
Wer sagt das?
Traveller hat gesagt.:
In C sollten generell Rückgabewerte nur primitive Typen sein.
Kannst du das begründen? Meinst du die vielen erfahrenen Programmierer haben bei dem Entwurf der MySQL API etwas falsch gemacht weil sie Zeiger zurückgeben? ;-]

Und bitte mache dich erstmal mit dem Forum hier vertraut und verwende Code-Tags für deine Codeschnipsel.

Außerdem ist der Dereferenzierungsoperator ein Präfixoperator und besitzt eine niedrigere Priorität als die Zuweisungsoperatoren. Dann übergibst du an operation einen int statt eines int*. Bitte versuche deinen Code ordentlicher zu schreiben und probiere es evtl. aus bevor du hier soetwas verzapfst.

Gruß
 
Zurück