printf Ausgabe auch als Variable bzw. Rückgabewert einer Funktion
-
Sicherlich nur eine Kleinigkeit, aber ich hoffe es kann mir jemand helfen:
Ich habe im Code hier eine printf-Ausgabe, möchte diese aber auch als Variable bzw. als Rückgabe einer Funktion nutzen.
In diesem Beispiel wäre es die Mac-Adresse, die in main() ausgegeben wird. Wie kann ich das als Wert in eine Variable übergeben? Danke im Voraus.#include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <linux/if.h> long mac_addr_sys ( u_char *addr) { struct ifreq ifr; struct ifreq *IFR; struct ifconf ifc; char buf[1024]; int s, i; int ok = 0; s = socket(AF_INET, SOCK_DGRAM, 0); if (s==-1) { return -1; } ifc.ifc_len = sizeof(buf); ifc.ifc_buf = buf; ioctl(s, SIOCGIFCONF, &ifc); IFR = ifc.ifc_req; for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR++) { strcpy(ifr.ifr_name, IFR->ifr_name); if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) { if (! (ifr.ifr_flags & IFF_LOOPBACK)) { if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) { ok = 1; break; } } } } close(s); if (ok) { bcopy( ifr.ifr_hwaddr.sa_data, addr, 6); } else { return -1; } return 0; } int main( int argc, char **argv) { long stat; int i; u_char addr[6]; stat = mac_addr_sys( addr); if (0 == stat) { for (i=0; i<6; ++i) { printf("%2.2x ", addr[i]);//Diese Ausgabe wird benötigt } printf( "\n"); } else { fprintf( stderr, "can't get eth-ID\n"); exit( 1); } return 0; }
-
printf() hat auch einige (kleine) Brüder wie fprintf() (gibt in ein FILE aus) oder sprintf() (schreibt in ein char-Array) - ich glaube, du benötigst letzteres.
Ansonsten: Da wir hier im C++ Board sind, solltest du lieber umsteigen auf IO-Streams
(die sind sicherer, einfacher zu handhaben und flexibler als printf() und Co.)
-
Das wäre mir auch lieber, als die IO C-Sachen. Welche IO-Stream-Alternativen würden denn passen, um printf in diesem konkreten Beispiel zu ersetzen?
-
std::stringstreamgreetz, Swordfish
-
Wenn du mehr wissen willst, wirf mal einen Blick in meinen Magazin-Artikel zum Thema "Ein- und Ausgabe in C++".
-
Werd mal schauen...
-
Habs jetzt mal so gelöst. Habs in eine eigene Funktion gelegt und diese in main aufgerufen. Der Rest ist geblieben. Wäre das OK?
string getMacAddr(void) { char tmp[18]; string mac_addr, mac_tmp; long stat; int i; u_char addr[6]; stat = mac_addr_sys( addr); if (0 == stat) { for (i=0; i<6; ++i) { sprintf(tmp,"%0.2x:",addr[i] ); mac_tmp = (string)tmp; mac_addr = mac_addr + mac_tmp; } } else { mac_addr ="not found"; } return mac_addr.substr(0,17); } int main( int argc, char **argv) { cout<<"Found MAC-Address: "<< getMacAddr()<<endl; return 0; }
-
Ja, das ist sicher eine Möglichkeit, aber arg kompliziert. Ich hätte ja auf printf() komplett verzichtet und stattdessen einen stringstream verwendet:
if(stat==0) { stringstream mac_tmp; for(int i=0;i<6;++i) mac_tmp<<hex<<setw(2)<<(int)addr[i]<<':'; return mac_tmp.str(); }
-
Danke. Ich hab Deinen Tipp mal versucht, bekomme bei setw einen Fehler.
'setw' was not declared in this scopemit
#include <iomanip>gehts dann auch durch.
Die Ausgabe ist allerdings unsauber, der spuckt mir das raus:
Found MAC-Address: 0: c:29:90:72:9c:
Fehlt da noch was?
-
setfill('0')
-
dixidix schrieb:
Danke. Ich hab Deinen Tipp mal versucht, bekomme bei setw einen Fehler.
'setw' was not declared in this scopemit
#include <iomanip>gehts dann auch durch.
Sorry, aber ich hab' dich für intelligent genug gehalten, die benötigten Header selber zu finden

Die Ausgabe ist allerdings unsauber, der spuckt mir das raus:
Found MAC-Address: 0: c:29:90:72:9c:
Fehlt da noch was?
Wenn dich die Leerzeichen stören, hilft vermutlich setfill(). Wenn du Probleme mit dem Doppelpunkt hast, kannst du dir mac_tmp.str() auch nehmen und nach Bedarf zurechtschneiden.
-
Danke so klappts:
string getHomeAddr(void) { char tmp[18]; string home_addr, home_tmp; long stat; int i; u_char addr[6]; stat = home_addr_sys( addr); if (0 == stat) { stringstream home_tmp; for(int i=0;i<6;++i) home_tmp<<hex<<setfill('0')<<setw(2)<<(int)addr[i]<<':'; return home_tmp.str().substr(0,17); } else { return "not found"; } }