3

我正在为 Pebble 进行开发,但起步并不顺利。

我正在尝试用 2 个字符串和 2 个值填充 text_layer,如下所示:

等待平均:3 最大:5

由于Pebble SDK 不支持,所以我malloc不能使用. 以下代码仅打印“4”:sprintfsnprintf

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

4 回答 4

10

你只是用snprintf错了。;-)

第二个参数(您尝试计算的结果很糟糕)是您要打印到的字符数组的长度,而不是您要写入的字符数。

像这样的东西应该工作:

char labelText[64]; // Is this big enough?
snprintf(labelText, 64,"%s %d %s %d",avgText,average,maxText,maximum);
于 2014-01-08T15:11:44.813 回答
3

sizeof(avgText)并且sizeof(maxText)是指针的大小,而不是数组大小。参见例如这里。将您的代码更改为

static char avgText[] = "WAIT AVG: ";
static char maxText[] = "MAX: ";

为了使它们成为数组。

编辑:

进一步注意,这sizeof(average)average内部覆盖的字节大小,而不是十进制表示会消耗多少字节。

编辑2:

正如罗迪的回答所说,计算我们想要的大小并将该大小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);

高温高压

于 2014-01-08T15:05:15.873 回答
1

正确阅读手册页snprintf()它说,第二个参数size用于引用number of bytes要写入的。

sizeof (avgText)并且sizeof(maxText)不会在这里工作。它指的是 的大小,而pointer不是length它所拥有的数组的大小。也许您想strlen()用于字符串长度。

于 2014-01-08T15:05:59.990 回答
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);

多谢你们

于 2014-01-08T15:11:37.443 回答