Dear Community,
I'm not sure why, but the sprintf() function does not want to play with strings.
I'm trying to make a JSON object.
String strCurrTime;
strCurrTime = Time.format(Time.now(), "%Y-%m-%d %H:%M:%S");
sprintf(json,"{\"temperature\": \"%f\", \"location\": \"%s\",\"unixTime\": \"%s\"}",temperature,location,strCurrTime);
I get this somewhat annoying error:
error: cannot pass objects of non-trivially-copyable type 'class String' through '...'
I really don't understand it; last time I hacked my way out of it by sticking my string into a const char array. But unfortunately this is not possible with my current task:
char strCurrTime[50]= Time.format(Time.now(), "%Y-%m-%d %H:%M:%S");
does not work: > error: incompatible types in assignment of 'String' to 'char [50]'
Is there a better way to include strings as data in a JSON object?
Thanks very much
You can use strCurrTime.c_str()
as the parameter to sprintf, Serial.printlnf, etc.
3 Likes
Ha! That worked brilliantly! Thanks again @rickkas7, you’re a champ.
Some background here:
String
is not the same as a char[]
but a class (once instanciated an object) that helps you deal with strings.
But since printf()
and its siblings expect a const char*
at the position where a %s
place holder has to be substituted it's not happy to see the address of a String
object which just happens to hold a char[]
somewhere in its "belly".
So you need a way to hand out that const char*
printf()
expects.
One way is as @rickkas7 said via a dedicated method (c_str()
) or via the also available cast operator overload (my prefered solution )
Like this
String someString = "test";
printf("%s", (const char*)someString);
3 Likes
A really neat post @ScruffR. Thanks so much. Very well explained. I could not find this info in the Particle documentation examples - they don’t use strings. I have never used cast operator overload before, and when I saw code like this I could only really guess what it was doing, so this was really helpful to me.
Cheers and thanks
Lindsay
1 Like