Zeigerproblem?



  • Hallo Leutz.
    Ich scheibe ein Programm, dass auf eine MySQL Datenbank zugreifen soll. Mit den Default werten, so wie ich die Klasse aus einem Tut übernommen habe, funzt das auch wunderbar. Änder ich dies aber ab, was man ja sollte, denn es wird ja nicht, wie ihr euch denken könnt, immer auf eine "Default" Datenbank zugegriffen, funktioniert das nicht.

    Bei dem Benutzer z.B. übergibt er ihm das, was ich eintippe, setzt aber noch irgendwelche Zeichen dahinter. Ich nehme an, dass ich da irgendwas bei der übergabe falsch mache. Ich halt euch mal den Quelltext rein.

    Einmal die Standart mysql.h (ausschnittweise nur die Funktion)

    MYSQL *		STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
    					   const char *user,
    					   const char *passwd,
    					   const char *db,
    					   unsigned int port,
    					   const char *unix_socket,
    					   unsigned long clientflag);
    

    Und jetzt den Funktionsaufruf im Hauptprogramm mit der Deklaration der Variablen:

    [cpp]
    #include <stdio.h>
    #include <string.h>
    #include "C:\Dev-Cpp\include\c++\3.3.1\backward\iostream.h"
    #include <conio.h>
    #if defined __WIN32__ || _MSC_VER
    #include <windows.h>
    #endif
    #include "c:\programme\mysql\mysql server 5.0\include\mysql.h"

    int main (int argc, char argv[])
    {
    using namespace std;
    char user;
    string host;

    cout << "Bitte geben Sie den Benutzernamen ein:" << endl;
    scanf("%S",&user);
    //cout << "Der Buntzer lautet:" << user << endl;
    getch();
    cout << "Bitte geben Sie den Host ein:" << endl;
    scanf("%S",&host);
    //printf("Der eingegebene Host lautet: %s",host);
    getch();
    MYSQL my;
    /* Handle initialisieren /
    my = mysql_init(NULL);
    if(my == NULL)
    {
    fprintf(stderr, " Initialisierung fehlgeschlagen\n");
    exit (0);
    }
    /* Mit dem Server verbinden /
    if( mysql_real_connect (
    my, /
    Zeiger auf MYSQL-Handler
    /
    &host, /
    Host-Name
    /
    &user, /
    User-Name
    /
    NULL, /
    Passwort für user_name /
    NULL, /
    Name der Datenbank*/
    0, /* Port (default=0) /
    NULL, /
    Socket (default=NULL)/
    0 /
    keine Flags / )
    == NULL) {
    *
    fprintf (stderr, "Fehler mysql_real_connect():"
    "%u (%s)\n",mysql_errno (my), mysql_error (my));
    }
    else
    printf("Erfolgreich mit dem MySQL-Server verbunden\n");

    /* Hier befindet sich der Code für die Arbeit mit MySQL */

    /* Verbindung trennen */
    mysql_close (my);
    return 0;
    getch();
    }
    [/cpp]

    Laufen tut das Programm soweit, nur wenn ich jetzt als Benutzer jetzt z.B. 'a' eingebe, nimmt er auch 'a' aber mit zich ASCII Zeichen noch dahinter. Ich könnt es ja mal selbst ausprobieren. Habs im Visual C++ .NET gemacht.



  • Ich vermute mal, die hast die abschließende 0 vergessen.
    Wenn in einem String "a" steht, steht eigentlich "a\0" drin.

    Da ist mir leider zu viel reines C drin, mit den Befehlen stehe ich immernoch auf Kriegsfuß. 😞



  • Der Formatspezifizierer "%S" gehört nicht zum Standard, iirc ist das eine MS Erweiterung (wenn auch mittlerweile unnötig). "%S" sorgt bei printf/scanf Funktionen, dass wide character Strings gehandelt werden, entsprechend bei wprintf/wscanf Funktionen single-byte character Strings. Da std::string aber nunmal single-byte ist (char), machst du etwas, was nicht funktionieren kann.
    Das ist wieder mal ein schönes Beispiel dafür, dass man als C++ Programmierer auf printf/scanf verzichten sollte. Sie sind halt nicht typsicher. Mit cin wäre sowas nicht passiert.

    edit:
    Oh mann, beim zweiten Hinsehen fallen mir ja noch ganz andere Fehler auf.
    user ist lediglich ein Zeichen, dh du darfst auch nur ein Zeichen darin einlesen und keinen ganzen String (wiederum Thema Typsicherheit). host ist ein Zeiger auf einen String, der wurde aber nie initialisiert ➡ UB. &host ist vom Typ string**, das macht an betreffender Stelle nicht wirklich Sinn (und nochmal Thema Typsicherheit).
    Und nochwas, getch() nach return? Ich denke, das ist wohl umgekehrt richtiger.


Anmelden zum Antworten