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()undfgColor()werden auch nur diverse Steuercodes ausgeben...?
Falls das der Fall ist, kannst du ja alle\nim Format-String ersetzen mit einem String der erst die original Farbe setzt, dann das\nund 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/vprintfkann 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; }