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::stringstream
    

    greetz, 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 scope
    

    mit

    #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 scope
    

    mit

    #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";
        }
    }
    

Anmelden zum Antworten