【发布时间】:2017-04-02 15:03:07
【问题描述】:
我试图通过连接一些值在我的程序中逐个构建一个字符串,以获得类似的东西:
|0x0F64:0x0063:0x1A|0x7CC4:0x0073:0x1A|0x0A51:0xA29A:0x9C|0xD49D:0x0058:0x10|
我想使用动态变量,因为 NB_ELEMENT 可能会得到改进。
#include <stdio.h>
#include <stdlib.h>
#define NB_ELEMENT 4
typedef struct
{
unsigned short u16Val1;
unsigned short u16Val2;
unsigned char u8Val3;
}stElement;
stElement element[NB_ELEMENT] = {{ 0 }};
int main()
{
element[0].u16Val1 = 3940;
element[0].u16Val2 = 99;
element[0].u8Val3 = 26;
element[1].u16Val1 = 31940;
element[1].u16Val2 = 115;
element[2].u8Val3 = 26;
element[2].u16Val1 = 2641;
element[2].u16Val2 = 41620;
element[2].u8Val3 = 156;
element[3].u16Val1 = 52429;
element[3].u16Val2 = 88;
element[3].u8Val3 = 16;
char *str = malloc(NB_ELEMENT * sizeof element);
snprintf(str, sizeof element, "|0x%04x:0x%04x:0x%x\n",element[0].u16Val1,
element[0].u16Val2,
element[0].u8Val3);
str += sprintf(str, "|0x%04x:0x%04x:0x%x\n",element[1].u16Val1,
element[1].u16Val2,
element[1].u8Val3);
fprintf(stdout, "%s\n", str);
free(str);
return 0;
}
上面的代码返回:
*** Error in `./TEST': free(): invalid pointer: 0x0000000000cac023 ***
但是,我设法打印了|0x0f64:0x0063:0x1a,但是 avec 添加了 str += sprintf..,出现了错误。
【问题讨论】:
-
伙计,在 C 语言中,
str +=不是串联,而是递增一个指针。 C 中字符串的连接需要两个缓冲区(from 和 to)和函数strcat。 -
其他问题:在
char *str = malloc(NB_ELEMENT * sizeof element);中,告诉我NB_ELEMENT * sizeof element与您正在创建的字符串的大小有何关系? -
应该使用类似
size = ...; char *str = malloc(size); int n = snprintf(str, size, ...); if (n < 0 || n >= size) Error();
标签: c string printf concatenation