我正在为Pebble开发,而且我的起步很艰难。
我正在尝试用2个字符串和2个值填充text_layer,如下所示:
WAIT AVG:3 MAX:5
由于Pebble SDK不支持malloc
,因此我无法使用sprintf
,因此我遇到了snprintf
。以下代码仅打印“4”:
srand(time(NULL));
int average = (rand()%6)+1;
int maximum = average + 2;
static char *avgText="WAIT AVG: ";
static char *maxText="MAX: ";
snprintf(labelText,sizeof(avgText) + sizeof(average) + sizeof(maxText) + sizeof(maximum),"%s %d %s %d",avgText,average,maxText,maximum);
非常感谢任何帮助。我知道我可以创建4个单独的TextLayers,但这对我来说是最后的选择。
答案 0 :(得分:10)
您只是使用snprintf
错误。 ; - )
第二个参数(您尝试计算得很严重)是您要打印的字符数组的长度,不是您尝试编写的字符数。
这样的事情应该有效:
char labelText[64]; // Is this big enough?
snprintf(labelText, 64,"%s %d %s %d",avgText,average,maxText,maximum);
答案 1 :(得分:3)
sizeof(avgText)
和sizeof(maxText)
是指针的大小,而不是数组大小。参见例如here。将您的代码更改为
static char avgText[] = "WAIT AVG: ";
static char maxText[] = "MAX: ";
为了使它们成为阵列。
编辑:
进一步注意,sizeof(average)
是内部的average
字节大小,不十进制表示将消耗多少字节。
EDIT2:
正如Roddy的回答所说,计算我们想要的大小并将该大小传递给snprintf
作为实际缓冲区大小是错误的。但是,如果有一个合理的上限(例如32位int
,10个字节(没有0终止符)总是足够的话,我们可以计算出我们想要的大小,但也许你可以给出一个较低的上限绑定在您的用例中):
char labelText [
sizeof avgText - 1 + 10 +
sizeof maxText - 1 + 10 + 3 + 1
];
/* sizeof avgText counts the 0-terminator, so does sizeof maxText, hence
the -1, two times 10 for the `int` (or any reasonable upper bound you have),
3 spaces and the 0-terminator. */
你甚至可以使用sprintf
。使用snprintf
,您可以执行以下操作:
snprintf(labelText, sizeof labelText,"%s %d %s %d", avgText, average, maxText, maximum);
HTH
答案 2 :(得分:1)
正确阅读snprintf()
的{{3}}。它说,第二个参数size
用于指代要写的number of bytes
。
sizeof (avgText)
和sizeof(maxText)
不会在这里工作。它指的是pointer
的大小,而不是它所拥有的数组的length
。也许你想用strlen()
作为字符串长度。
答案 3 :(得分:0)
所以这很有效:
srand(time(NULL));
static char labelText[]="WAIT AVG: xxxxx MAX: xxxxxx";
int average = (rand()%6)+1;
int maximum = average + 2;
static char avgText[]="WAIT AVG: ";
static char maxText[]="MAX: ";
snprintf(labelText,sizeof(labelText),"%s %d %s %d",avgText,average,maxText,maximum);
text_layer_set_text(waitField,labelText);
谢谢你们