Makro für eine Zeichenkette



  • Hallo,

    ich möchte eine Makro-Anweisung schreiben, die eine variabel lange Zeichenkette erzeugt mit sich wiederhollenden Zeichen. z.B. für printf - "%s%s%s".

    Ich habe mir sowas vorgestellt:

    #define TEST(a,b,c) while(a!=0) strcat(b,c); a--
    
    ...
    char *Zeichenkette = NULL;
    char Tmp[40];
    
    Tmp[0] = '\0'; 
    
    Zeichenkette = strdup(TEST(10,Tmp,"%s"));
    
    printf ("Ausgabe: %s\n", Zeichenkette);
    
    ...
    

    Ausgabe: %s%s%s%s%s%s%s%s%s%s

    Danke



  • wieso makro.. mach ne funktion

    wenn du es unbending als makro haben willst dann fehlen die klammer bei while

    #define TEST(a,b,c) while(a!=0){  strcat(b,c); a-- }
    

    dein code sieht nicht compilierbar aus...

    wenn das Design so sein soll, das TEST auswechselbar ist, dann nimm funktionpointer....

    typedef void (*austauschfkt) (int a,char *b, char *c);
    
    void TEST(int a,char *b, char *c){
     while(a!=0){  
    strcat(b,c);
     a-- 
    }
    }
    


  • BorisDieKlinge schrieb:

    wieso makro.. mach ne funktion

    Funktion ist dann vielleicht doch eine bessere Löung.

    Eigentlich Makro wollte ich möglichst klein und übersichtlich halten, damit ich nur TEST(10) verwende und als Ergebniss die 10 Mal %s habe, dann dachte ich es mir variabler zu gestallten und kamm auf TEST(a,b,c)...

    Irgendwo im Netz fand ich früher ein Beispiel mit A##B indem die Zeichenkette verkettet wurde... nun finde ich es nicht mehr.



  • Irgendwo im Netz fand ich früher ein Beispiel mit A##B indem die Zeichenkette verkettet wurde... nun finde ich es nicht mehr.

    ????

    ne makro ist gefährlich blöd zum debuggen;) mach ne funktion , wenns autauschbar sein soll wie gesagt funktionzeiger....;)

    char* TEST(int iCount, char * Tmp, char *pDat){
    int i;
     for(i=0; i< iCount,i++,strcat(Tmp,pDat));
    return Tmp;
    }
    
    char acBuf[100];
    printf( "%s",strdup(TEST(5,acBuf,"%s")));
    

    schau aber das du genug speicher resviert hast wenn du TEST funktion ausführst...

    P.S.: Hab das nicht gestestet.. also nich mekkern ihr vögel^^



  • BorisDieKlinge schrieb:

    Irgendwo im Netz fand ich früher ein Beispiel mit A##B indem die Zeichenkette verkettet wurde... nun finde ich es nicht mehr.
    ????

    Kennste nich, schon klar. Gibts aber.



  • ohh my god! schrieb:

    BorisDieKlinge schrieb:

    Irgendwo im Netz fand ich früher ein Beispiel mit A##B indem die Zeichenkette verkettet wurde... nun finde ich es nicht mehr.
    ????

    Kennste nich, schon klar. Gibts aber.

    Ich glaube im rororo Buch gab's auch als Beispiel.

    http://ecx.images-amazon.com/images/I/71MQW5MBZEL._SL500_AA240_.gif



  • mach das doch mit dem va_list makro. und ner ellipse.



  • Big Brother schrieb:

    mach das doch mit dem va_list makro. und ner ellipse.

    Was ist das? 😕



  • Wenn die Strings immer gleich sein sollen, kannst du auch auf eine Ellipse verzichten:

    int Dublicator ( char buf [], int size, char* s, int n )
    {
    	int i = 0;
    	int slen = strlen ( s );
    	int len = slen;
    
    	while ( i < n )
    	{
    		if ( len > ( size - 1) )
    			return Error ( "Dublicator: Buffer too small." );
    		strcat ( buf, s );
    		len += slen;
    		i++;
    	}
    
    }
    
    int main()
    {
    	char buffer [16] = {0};
    	Dublicator ( buffer, sizeof ( buffer ), "%s", 10 );
    	return 0;
    }
    


  • shuriko schrieb:

    Big Brother schrieb:

    mach das doch mit dem va_list makro. und ner ellipse.

    Was ist das? 😕

    Guckst du hier:

    int Error ( char* msg )
    {
    	fprintf ( stderr, "%s\n", msg );
    	return 1;
    }
    
    int StrCat( char buf[], unsigned size, char* src, ... )
    {
    	char* next = src;
    	int len = 0;
    	va_list vl;
    	va_start ( vl, src );
    
    	while ( next )
    	{
    		if( ( len  + strlen ( next ) ) > ( size - 1 ) )
    {
    			return Error ( "StrCat: Buffer too small.\n" );
    va_end( vl );
    }
    		strcat ( buf, next ); 
    		len += strlen ( next );
    		next = va_arg ( vl, char* );
    	}
    
    	va_end( vl );
    	return 0;
    }
    
    int main()
    {
    	char buffer [16] = {0};
    	StrCat ( buffer, sizeof ( buffer ), "%s", "%s", "%d", "%f", NULL );
    	puts ( buffer );
    	return 0;
    }
    

    Eine Ellipse sind die drei Punkte am Ende der Parameterliste einer Funktion.
    va_list dient zur Definition einer Liste, weiteres kannst du z.B. hier erfahren.
    http://pronix.linuxdelta.de/C/standard_C/c_programmierung_21.shtml



  • Mir ist da vorhin eine Zeile zu tief gerutscht, hier noch einmal:

    int StrCat  ( char buf[], unsigned size, char* src, ... )
    {
    	char* next = src;
    	int len = 0;
    	va_list vl;
    	va_start ( vl, src );
    
    	while ( next )
    	{
    		if( ( len  + strlen ( next ) ) > ( size - 1 ) )
    		{
    			va_end ( vl );
    			return Error ( "StrCat: Buffer too small.\n" );
    		}
    		strcat ( buf, next ); 
    		len += strlen ( next );
    		next = va_arg ( vl, char* );
    	}
    
    	va_end ( vl );
    	return 0;
    }
    

Anmelden zum Antworten