Hey,
Ik ben bezig met een console te maken voor een spel, en natuurlijk zal ik printf moeten gebruiken. MAAR printf kan soms problemen geven als in een string het karakter % in voorkomt. En het %-teken is te belangrijk in een boodschap, ik kan het niet zomaar wegfilteren. Voorbeeld: de Quake 3 engine doet dit wel weg, en elke % wordt vervangen door een punt. Je kunt dus geen % in Quake 3 gebruiken in je naam of in een chatbericht. Ik moest dus mijn eigen printf-functie schrijven, en ik heb het ook gedaan.
Het verschilt in printf dat het niet '%' als speciaal karakter gebruikt maar '\1', of 1, wat nooit wordt gebruikt. Het returnt een char *, en kan dus in andere functies worden gebruikt, bv. bla(strf("int: \1i", 5)); als bla een char * als argument heeft.
Dit werkt perfect met de volgende code:
char *test = strf("Integer: \1i\nBool: \1b\nString: \1s\n", 5, true, "bla");
Maar om de een of andere reden werkt dit niet met floats. (Dus dit:
char *test = strf("Float: \1f\n", 2.1f);
werkt niet) Hoe komt dit?
En nog een vraag: hoe kan men floats naat strings omzetten, zonder sprintf te gebruiken? Ik weet dat voor integers de niet-ANSI itoa bestaat, maar voor floats?
Ik ben bezig met een console te maken voor een spel, en natuurlijk zal ik printf moeten gebruiken. MAAR printf kan soms problemen geven als in een string het karakter % in voorkomt. En het %-teken is te belangrijk in een boodschap, ik kan het niet zomaar wegfilteren. Voorbeeld: de Quake 3 engine doet dit wel weg, en elke % wordt vervangen door een punt. Je kunt dus geen % in Quake 3 gebruiken in je naam of in een chatbericht. Ik moest dus mijn eigen printf-functie schrijven, en ik heb het ook gedaan.
Het verschilt in printf dat het niet '%' als speciaal karakter gebruikt maar '\1', of 1, wat nooit wordt gebruikt. Het returnt een char *, en kan dus in andere functies worden gebruikt, bv. bla(strf("int: \1i", 5)); als bla een char * als argument heeft.
Code:
char *strf(char *fmt, ...)
{
va_list ap;
int i;
float f;
bool b;
char tmp[2000] = {'\0'};
const char *p=fmt;
char ret[2000] = {'\0'};
va_start(ap,fmt);
while (*p){
if (*p == '\1'){
memset(tmp, 0, 2000);
p++;
switch(*p)
{
case 'i':
i = va_arg(ap,int);
sprintf(tmp, "%i", i);
strncat(ret, tmp, 2000 - strlen(ret));
break;
case 'f':
f = va_arg(ap, float);
sprintf(tmp, "%f", f);
strncat(ret, tmp, 2000 - strlen(ret));
break;
case 'b':
b = va_arg(ap, bool);
sprintf(tmp, "%i", (int)b);
strncat(ret, tmp, 2000 - strlen(ret));
break;
case 's':
strncpy(tmp, va_arg(ap, char *), 2000);
strncat(ret, tmp, 2000 - strlen(ret));
break;
default:
strncat(ret, p, 1);
}
} else {
strncat(ret, p, 1);
}
p++;
}
va_end(ap);
return ret;
}
Dit werkt perfect met de volgende code:
char *test = strf("Integer: \1i\nBool: \1b\nString: \1s\n", 5, true, "bla");
Maar om de een of andere reden werkt dit niet met floats. (Dus dit:
char *test = strf("Float: \1f\n", 2.1f);
werkt niet) Hoe komt dit?
En nog een vraag: hoe kan men floats naat strings omzetten, zonder sprintf te gebruiken? Ik weet dat voor integers de niet-ANSI itoa bestaat, maar voor floats?
Laatst bewerkt: