I'm trying to make a class with a char* ptr to where I can print data with automatic allocation.
class String { char* data; size_t size; int pos; void init(size_t size) { this->size = size; data = new char[this->size+1]; data[0] = 0; pos = 0; } public: String(size_t size=1) { init(size); } ... void show(); void s_printf(char *format, ...); } I have the allocation, and raii things everything working ok. But my wrapper function, doesn't process the variable arguments the way I want. I'm using va_list,va_start,va_end to the best of my knowledge but it seems that is not enough.
Code:
void sprintf(char *format, ...) { va_list args; va_start (args, format); int c = vsnprintf(&data[pos],size-pos,format,args); // this value is different on windows and linux (or msvc and gcc) if((c == -1) || (c > (size-pos))) { this->size *= 2; data = (char*)realloc(data,this->size); this->sprintf(format,args); } else { pos += c; data[pos] = 0; } va_end (args); return; } The reallocation, the handling of the variable "pos" and "size", everything is ok. But the formatting is wrong:
Example:
String x; x.sprintf("thing %d, ",123); x.sprintf("other thing"); x.show(); On windows it prints:
thing 5698652, other thing
On linux, the same thing and sometimes, from my testing, the "other thing" pointer value is even used as the first "%d" in "thing %d" (so it prints "thing address,") where address is the address of the char* "other thing"
va_listas a parameter to a variadic function does not pass the parameters as they were originally passed.std::stringavailable.