Funktion von cout in printf
-
Hallo,
ich hab ein kleines Problem. Ich habe ein wenig Code, der die IP-Adresse
zu einer angegebenen URL ausgiebt. Allerdings ist die exe 460kB groß! Das
dürfte durch den iostream Header kommen. Vielleicht kann mir jemand sagen,
wie ich die cout Funktion die die IP-Adresse in der xxx.xxx.xxx.xxx. Form ausgibt in eine
printf Funktion die das selbe ausgiebt umwandlen kann.Hier mein Code:
#include <winsock.h> #include <exception> #include <iostream.h> using namespace std; class WindowsSocketInit { public: WindowsSocketInit() { if ( !Init() ) throw exception(); } ~WindowsSocketInit() { bool bOk = WSACleanup() != 0; } private: bool Init() { WSADATA wsa; return WSAStartup( MAKEWORD( 2, 2 ), &wsa ) == 0; } }; int main(int argc,char* argv[]) { WindowsSocketInit socketInit; struct hostent* host = 0; for ( int i = 1; i < argc; ++i ) { // den Servernamen aufloesen host = gethostbyname(argv[i]); // die IP-Adresse ausgeben in_addr* ia = (struct in_addr*)host->h_addr; cout << "\tip: " << inet_ntoa(*ia) << endl; } return 0; }
-
Dir ist schon bewußt, dass das C++ ist?
[Edit]Und deine Frage versteh ich auch nicht bzw. hab sie noch nicht gefunden.[/Edit]
-
Die Anweisung lautet:
printf("\tip: %s", inet_ntoa(*ia));
Aber wenn du die Größe der ausführbaren Datei verkleinern möchtest, dann such
besser nach entsprechenden Compilereinstellungen. Zusätzlichen Code aus der
C runtime zu verwenden, dürfte deine Datei eher noch grösser machen.Zum Vergleich:
Bei meinem System (VC6) ist dein Programm im Debug-Build ~200K, und im Release-Build
~48K gross. Welchen Compiler verwendest du?
-
das versuch ich mal
ihm ist bewusst das c++
er will die iostream raus haben und stattdessen printf benutzen
( dann muss er aber stdio.h includen )und frägt wie man die zeile
cout << "\tip: " << inet_ntoa(*ia) << endl;
in ein printf umwandeln.
in der art
char *ch = inet_ntoa(*ia); printf("\ttip : %c\n", ch); // ka ob das so gehen wird
dazu muss er in ein char pointer den rückgabewert von inet_ntoa(*ia) "reinladen" und dann mit printf ausgeben.
naja er könnt aber auch mal statt debug version (unterstelle ich mal jetzt so ) die release erstellen und sehen ob immer noch 460kb gross
( aber das nur so mal am rande )
-
mist zu langsam
-
Hallo,
danke erstmal für die schnellen Antworten. Ich benutze den Dev-C++ Compiler,
weiß allerdings nicht wo ich die Debug in eine Release exe umstellen kann.
Optimierungen beim compilieren hatte ich schon angeschaltet. Allerdings
sind meine exe-Dateien wenn ich den iostream-Header nicht benutze auch nur
um die 40kB groß.Und super, der Tip von 24x7_coder funktioniert. Vielen Dank!
Kann ich die IP-Adresse in der xxx.xxx.xxx.xxx Form auch in einen Speicher
schreiben?Danke nochmal
yogle
-
Ich benutze den Dev-C++ Compiler,
weiß allerdings nicht wo ich die Debug in eine Release exe umstellen kann.
Optimierungen beim compilieren hatte ich schon angeschaltet.Weiss ich leider auch nicht, ich kenne den Dev-C++ Compiler nur dem Namen
nach. Aber ehrlich gesagt würde ich mir zu diesem Zeitpunkt keine grossen
Gedanken um Optimierungen machen. Solltest du mal Programme schreiben, bei
denen das wichtig wird, wirst du vermutlich nicht mehr mit Dev-C++ arbeiten.Kann ich die IP-Adresse in der xxx.xxx.xxx.xxx Form auch in einen Speicher
schreiben?Sicher. Etwa so:
char ip[16]; strcpy(ip, inet_ntoa(*ia));
..wenn man mal alle Fehlermöglichkeiten großzügig unbeachtet läßt.
-
Hallo,
ja ich glaube die Fehler treten auf. Wenn ich nämlich darunter die Funktion zur Kontrolle schreibe,
kommt nur Schwachsinn wie 50 oder solche Sachen raus.char ip[16]; strcpy(ip, inet_ntoa(*ia)); printf ("\tip: %c", ip);
Auch %s oder so etwas nützt nichts.
Was kann man dagegen tun?yogle
-
Ich kann deinen Fehler nicht reproduzieren. Poste nochmal deine geändertes
Programm (oder die main()-Funktion, sofern der Rest unverändert ist).
-
Ich möchte kontrollieren ob für den char ip wirklich genau xxx.xxx.xxx.xxx
abgespeichert wurde. Das wollte ich durch eine zweite Ausgabe der IP tun.int main(int argc,char* argv[]) { WindowsSocketInit socketInit; struct hostent* host = 0; for ( int i = 1; i < argc; ++i ) { // den Servernamen aufloesen host = gethostbyname(argv[i]); // die IP-Adresse ausgeben in_addr* ia = (struct in_addr*)host->h_addr; printf("\tip: %s", inet_ntoa(*ia)); char ip[16]; strcpy(ip, inet_ntoa(*ia)); printf ("\n\nip: %c", ip); } return 0; }
Allerdings funtkioniert es mal wieder nicht.
Ich will halt die IP-Adresse
in einer Variablen speichern, so dass ich später damit weiterarbeiten kann.
Z.B. zum verbinden über sockets zu dieser IP.yogle
-
Ausser, dass es "%s" - nicht "%c" - heissen sollte, sehe ich kein Problem.
Es sei denn, deine IP-Adresse ist länger als 15 bytes. In dem Fall mach halt
das char-Array grösser.
-
Hallo,
stimmt ich muss mich irgendwo verschrieben haben.
Funktioniert jetzt super!
Vielen Dank für die hilfreichen und schnellen Antworten!yogle