Kurze Design Frage
-
Hallo, die Funktion InternetConnect nimmt nur C Strings an wie es scheint.
Daher meine Frage was ist besser wenn ich es so mache:
int MyClass :: VerbindeZuServer(std::string srvname, std::string username, std::string password ) { HINTERNET net; net = InternetOpen(0, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, net = InternetConnect( hinternet, srvname.c_str() , INTERNET_DEFAULT_FTP_PORT, username.c_str(), password.c_str(), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, NULL ); return 0; }Oder wenn ich das so mache:
int MyClass :: VerbindeZuServer(char* srvname, char* username, char* password ) { HINTERNET net; net = InternetOpen(0, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, net = InternetConnect( hinternet, srvname , INTERNET_DEFAULT_FTP_PORT, username, password, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, NULL ); return 0; }Mit .c_str(); mache ich ja aus einem C++ String einen C String aber macht das Sinn?
Oder sollte ich da lieber direkt die C Strings benutzen obwohl ich ja eigentlich in C++ Programmiere.
-
Ersteres ist besser - jedoch ist es sinnvoll die std::string's als const std::string& zu übergeben, so werden sie nicht kopiert.
std::string's haben gegenüber C-Strings viele Vorteile - suche mal hier im Forum danach.
-
Wenn du nur C-Strings brauchst, dann nimm C-Strings.
-
sdfjse schrieb:
Wenn du nur C-Strings brauchst, dann nimm C-Strings.

Aber trotzdem: Nimm const char*!
-
Komm mal ins IRC cooky :<
-
Okay aber wie gebe ich einen C String richtig ein.
So stürtzt mir das Programm ab:

my_class obj; char *str=0; cin>>str; obj.VerbindeZuServer ( str,"test","test" );
-
CptQuak schrieb:
Okay aber wie gebe ich einen C String richtig ein.
Nur weil du einen C String übergibst, heißt das nicht, dass du ihn auch zur Eingabe nutzt. (Da nutzt du lieber std::string) (Zudem hast du das Speicherkonzept wohl überhaupt nicht verstanden..)
-
char *var = "ABC"; // Reserviert mir 3 Byte + 1 Byte Nullterminator Im Speicher: [41][42][43][0] char *var=0; // Zeigt auf gar nichts, var braucht eine Adresse wo es drauf zeigen kannDas ist doch so richtig oder? Wenn nicht korrigiert micht plz.
Bsp. 1
int VerbindeZuServer(const char* srvname, const char* username, const char* password ); int main () { std::string var; cin>>var; VerbindeZuServer(var.c_str() , "test","test"); // c_str() wird hier einmal aufgerufen } int VerbindeZuServer(const char* srvname, const char* username, const char* password ) { InternetConnect( hinternet, servername , INTERNET_DEFAULT_FTP_PORT, username, password, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, NULL ); }Bsp. 2
int VerbindeZuServer(std::string srvname, std::string username, std::string password ) int main() { std::string var; cin>>var; VerbindeZuServer(var.c_str() , "test","test"); // c_str() wird hier einmal aufgerufen } int VerbindeZuServer(std::string srvname, std::string username, std::string password ) { // Hier wird .c_str() noch 2 weitere male aufgerufen InternetConnect( hinternet, servername.c_str() , INTERNET_DEFAULT_FTP_PORT, username.c_str(), password.c_str(), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, NULL ); }Wäre ein Grund Bsp.1 zu benutzen da ich dort im Programm die Funktion .c_str() ja nur insgesamt einmal aufrufe?
Und in Bsp.2 rufe ich .c_str() ja sogar schon 3 mal auf. (Ich denke mal Bsp.2 kostet auch mehr Zeit in der ausführung )
Ist das so richtig?
-
Oops sry hab mich bei den Funktionsparametern mit den Namen gerade vertan ... -.-
(Aber egal das gehört ja jetzt net zum Thema)
-
CptQuak schrieb:
Das ist doch so richtig oder? Wenn nicht korrigiert micht plz.