tysonlt
1
Hello!
I am having trouble with the '*' specifier in printf, as follows:
Serial.begin(9600);
char buf[50];
sprintf(buf, "|%-20s|", "HELLO");
Serial.println(buf);
I get "|HELLO |" on the serial mon. All good. However, if I try:
Serial.begin(9600);
char buf[50];
sprintf(buf, "|%-*s|", 20, "HELLO");
Serial.println(buf);
I get a single "|" character.
What am I doing wrong? The same format spec gets me the result I want using gcc.
Thank you!
Please post a full example program that shows the problem.
tysonlt
3
void setup() {
char buf[50];
Serial.begin(9600);
//print with hard-coded pad length, prints: |HELLO |
sprintf(buf, "|%-20s|", "HELLO");
Serial.println(buf);
//clear buffer
memset(buf, 0, sizeof(buf));
//print with deferred pad length, prints: |
sprintf(buf, "|%-*s|", 20, "HELLO");
Serial.println(buf);
}
void loop() {}
Looks to me that that 'feature' is not supported by the Arduino snprintf, similar to support for floating point.
I've tried below few variation as well and the result is the same; both only print the pipe
sprintf(buf, "|%*s|", -20, "HELLO");
Serial.println(buf);
When printing the buffer byte by byte, the second character is the null terminator
for (uint8_t cnt = 0; cnt < sizeof(buf); cnt++)
{
if (buf[cnt] < 0x10)
Serial.print(" 0x0");
else
Serial.print(" 0x0");
Serial.print(buf[cnt], HEX);
}
Ah. Thanks folks. Looks like we're hardcoding the length 
You could build the format string on the fly:
snprintf(format, sizeof(format), "|%%%ds|", -20);
snprintf(buffer, sizeof(buffer), format, "HELLO");