snprintf + Pebble

时间:2014-01-08 15:00:05

标签: c sizeof strlen printf pebble-sdk

我正在为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,但这对我来说是最后的选择。

4 个答案:

答案 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);

谢谢你们