eigenes pseudo printf() fehler bei long double und algemeine fragen dazu



  • dd++ schrieb:

    nimm lieber http://linux.die.net/man/3/vasprintf, da hast du nicht das Problem mit dem Bufferoverflow

    <a href= schrieb:

    man: vasprintf(3)">These functions are GNU extensions, not in C or POSIX. They are also available under *BSD. The FreeBSD implementation sets strp to NULL on error.



  • McMorf arbeitet mit g++



  • hustbaer schrieb:

    Ich nehme an die Funktionen bgColor() und fgColor() werden auch nur diverse Steuercodes ausgeben...?
    Falls das der Fall ist, kannst du ja alle \n im Format-String ersetzen mit einem String der erst die original Farbe setzt, dann das \n und dann wieder die gewünschte Farbe setzt.

    Also quasi aus " Trallala: %d\nBlub: %d " würde dann " Trallala: %d{set-bg-color-sequence}{set-fg-color-sequence}\n{set-bg-color-sequence}{set-fg-color-sequence}Blub: %d ".

    Da sich dadurch nichts an der Reihenfolge und Art der Formatierungszeichen ändert, kannst du den so modifizierten String dann 1:1 an vprintf übergeben.

    Was dein Vorhaben mit dem Zerstückeln des Format-Strings angeht... nein, das geht nicht so einfach. printf/vprintf kann ja z.B. beim 2. Teilstück nicht wissen wie viele/welche Formatierungszeichen im ersten Teilstück enthalten waren.

    Ja, manchmal sieht man den wald vor lauter bäumen nicht 🙂
    aber darauf währ ich gez nie gekommen, wobei das ja der einfachste ansatz ist 🙂



  • habs dann mal weiter ausgearbeitet, schon viel schöner das ganze....
    ok, das mit den compiler anweisungen muss ich mir dann mal angucken, aber immo benutz ich ja nur gcc/g++....

    hier mal der code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
    #include <stdarg.h>
    #include <iostream>
    
    #ifdef WIN32
      #define WINDOWS
    #elif WIN64
      #define WINDOWS
    #elif _WIN32
      #define WINDOWS
    #elif linux
      #define LINUX
    #elif _linux_
      #define LINUX
    #elif __APPLE__
    	#define MAC
    #endif
    
    //Farb Konstanten Linux/Unix/BSD für terminals die "ansi escape sequenzen" unterstützen
    #define normal	0x00
    #define black   0x1E
    #define red 		0x1F
    #define green   0x20
    #define yellow  0x21
    #define blue    0x22
    #define magenta 0x23
    #define cyan    0x24
    #define white   0x25
    
    //nicht schön aber selten :P
    int bgColor(unsigned char _bgColor)
    {
      #ifdef WINDOWS
    		hwnd=GetStdHandle(STD_OUTPUT_HANDLE);
    		CONSOLE_SCREEN_BUFFER_INFO csbi;  	
    		GetConsoleScreenBufferInfo(hwnd, &csbi );
      	return SetConsoleTextAttribute(hwnd,((csbi.wAttributes & 0xFF0F) | (_bgColor << 4)));
      #endif
    	#ifdef LINUX
    		if(_bgColor!=0)
    		{
    			return printf("\033[%im",(_bgColor+10));
    		}else
    		{
    			return printf("\033[%im",0);
    		} 
      #endif
    	#ifdef MAC
        #warning console.text.bgColor() not implemented for Mac yet 
        return 0;
    	#endif
    }
    //nicht schön aber selten :P
    int fgColor(unsigned char _fgColor)
    {
      #ifdef WINDOWS  
    		hwnd=GetStdHandle(STD_OUTPUT_HANDLE);
    		CONSOLE_SCREEN_BUFFER_INFO csbi; 
      	GetConsoleScreenBufferInfo( hwnd, &csbi );
      	return SetConsoleTextAttribute(hwnd,(csbi.wAttributes & 0xFFF0) | _fgColor);   
      #endif
    	#ifdef LINUX
    		return printf("\033[%im",_fgColor); 
      #endif
    	#ifdef MAC
        #warning console.text.fgColor() not implemented for Mac yet 
        return 0;
    	#endif
    }
    
    int mkForeColor(char *colorString ,unsigned char color)
    {
    	char buffer[10]={};
    	char *ptrBuffer=&buffer[0];
    	sprintf(buffer,"\033[%im",color);
    	while(*ptrBuffer!=0)*colorString++=*ptrBuffer++;
    	return strlen(buffer);
    }
    int mkBackColor(char *colorString ,unsigned char color)
    {
    	char buffer[10]={};
    	char *ptrBuffer=&buffer[0];
    	sprintf(buffer,"\033[%im",(color+10));
    	while(*ptrBuffer!=0)*colorString++=*ptrBuffer++;
    	return strlen(buffer);
    }
    
    int _printf(unsigned char _fgColor, unsigned char _bgColor, const char *format, ...)
    {
    	char color[10]={};
    	char buffer[4096]={};
    	char *ptrBuff=&buffer[0];
    	char *ptrColor=&color[0];
    
    	#ifdef LINUX
    		while(*format!=0)
    		{
    			if(*format!='\n')
    			{
    				*ptrBuff++=*format++;
    			}else
    			{
    				mkBackColor(color,normal);
    				while(*ptrColor!=0)*ptrBuff++=*ptrColor++;
    				*ptrBuff++='\n';		
    				ptrColor=&color[0];	
    				mkBackColor(color,_bgColor);
    				while(*ptrColor!=0)*ptrBuff++=*ptrColor++;
    				ptrColor=&color[0];	
    				format++;
    			}
    		}
    	#endif
    
      bgColor(_bgColor);
      fgColor(_fgColor);
    
      va_list params;
      va_start(params,format);
      int result = vprintf(buffer, params);
      va_end(params);
    
      bgColor(normal);  
      fgColor(normal);
      return result;
    }
    
    int main(int argc, char* argv[])
    {
    	char chr=123;
    	int integer=123;
    	unsigned int uint=123;
    	short int sinteger=123;
    	long int linteger=123;
    	double dbl=123.321;
    	long double ldbl=123.321;
    
    	char *cchar=(char*)"HalloWelt!";
    	char *addy=cchar;
    	void *paddy=&cchar;
    
    	_printf(cyan,normal,"Variablen:\n");
    
    	printf("%s\n",cchar);
    	_printf(red,normal,"%s\n",cchar);
    
    	printf("CHAR %c\n",'#');
    	_printf(red,normal,"CHAR %c\n",'#');
    
    	printf("INT %i\n",integer);
    	_printf(red,normal,"INT %i\n",integer);		
    
    	printf("uINT %u > %o > %x > %X\n",uint,uint,uint,uint);
    	_printf(red,normal,"uINT %u > %o > %x > %X\n",uint,uint,uint,uint);	
    
    	printf("LONG DBL %LG > %Lf > %LE \n",ldbl,ldbl,ldbl);
    	_printf(red,normal,"LONG DBL %LG > %Lf > %LE \n",ldbl,ldbl,ldbl);
    
    	printf("DBL %.3f > %E > %.2e\n",dbl,dbl,dbl);
    	_printf(red,normal,"DBL %.3f > %E > %.2e\n",dbl,dbl,dbl);
    
    	printf("sINT %hi\n",sinteger);
    	_printf(red,normal,"sINT %hi\n",sinteger);	
    
    	printf("lINT %li\n",linteger);
    	_printf(red,normal,"lINT %hi\n",linteger);	
    
    	_printf(cyan,normal,"Speicher Addressen:\n");
    
    	printf("ADDY: %p\n",&addy);
    	_printf(red,normal,"ADDY: %p\n",&addy);	
    
    	printf("pADDY: %p\n",paddy);
    	_printf(red,normal,"pADDY: %p\n",paddy);	
    
    	return 0;
    }
    

    Herzlichen dank für die ganzen rückmeldungen !
    Ihr habt mir sehr geholfen !
    Mfg Benny



  • // ...
    
    int main()
    {
        char* fmt = malloc(64*1024);
        memser(fmt, "A", 64*1024);
        fmt[1024*1024 - 5] = 'a';
        fmt[1024*1024 - 4] = 'h';
        fmt[1024*1024 - 3] = '!';
        fmt[1024*1024 - 2] = '\n';
        fmt[1024*1024 - 1] = 0;
        _printf(black, red, fmt);
        return 0;
    }
    

Anmelden zum Antworten