在C中追加的正确方法

在C中追加的正确方法,c,string,C,String,我有以十六进制值捕获的数据包,我想将它们存储到一个已定义的数组中。最后,当我做puts时,它只打印一个值?为什么不工作?我必须使用strcat吗 char fullArray[1514]; int i=0; for(i = 0; i < h->caplen; i++) { printf("%02X ", p[i]); printf("\n");

我有以十六进制值捕获的数据包,我想将它们存储到一个已定义的数组中。最后,当我做puts时,它只打印一个值?为什么不工作?我必须使用strcat吗

char fullArray[1514];
        int i=0;
            for(i = 0; i < h->caplen; i++)
            {
                  printf("%02X ", p[i]);
                  printf("\n");
                  sprintf(fullArray,"%02X ",p[i]);
            }
puts(fullArray); 
charfullarray[1514];
int i=0;
对于(i=0;icaplen;i++)
{
printf(“%02X”,p[i]);
printf(“\n”);
sprintf(全数组,“%02X”,p[i]);
}
puts(全数组);

sprintf
在fullArray的开始处输出

如果要在其后面追加,应使用
sprintf(fullArray+strlen(fullArray),…)
查找空字符。通过使用
sprintf
的返回值,可以避免每次计算长度

strcat
将不会启用类似于
printf
的格式设置。因此,您可以将
sprintf
复制到临时缓冲区,并使用
strcat
fullArray
的末尾复制该缓冲区

警告,您必须确保1514的大小足以连接所有这些格式化字符串。

在下面的示例中,我持有两个变量:指向下一个写入位置的指针和缓冲区中剩余的可用大小。每次调用
snprintf
时,它都不会写入超过缓冲区末尾的内容,我使用它的返回值来更新这两个变量。必须至少保留1个字节才能保存
snprintf
输出但未计入其返回值的最终
\0

char fullArray[1514];
char *nextwrite = &fullArray[0];
int buf_remaining_size = 1514;
int i = 0;
for(i = 0; i < h->caplen; i++)
{
    if(buf_remaining_size <= 1) {
        /* your buffer is too small! Handle error */
        break;
    }

    printf("%02X\n", p[i]);
    int written = snprintf(nextwrite, buf_remaining_size, "%02X ", p[i]);    

    nextwrite += written;
    buf_remaining_size -= written;
}
charfullarray[1514];
char*nextwrite=&fullArray[0];
int buf_剩余尺寸=1514;
int i=0;
对于(i=0;icaplen;i++)
{

如果(buf_剩余_size您的代码将导致数组中只有
p[(h->caplen)-1]
。 你需要:

for(i = 0; i < h->caplen; i++)
            {
                  printf("%02X ", p[i]);
                  printf("\n");
                  if(i==0)
                  sprintf(fullArray,"%02X ",p[i]);
                  else if(strlen(fullArray)<(h->caplen)){
                      char a[10];
                      sprintf(a,"%02X",p[i]);
                      strcat(fullArray,a);
                      }
             }
(i=0;icaplen;i++)的

{
printf(“%02X”,p[i]);
printf(“\n”);
如果(i==0)
sprintf(全数组,“%02X”,p[i]);
else if(strlen(全阵列)caplen)){
chara[10];
sprintf(a,“%02X”,p[i]);
strcat(全阵列,a);
}
}

需要更新缓冲区地址才能使用sprintf;而且snprintf更安全。@Arsane我应该在代码中做什么更改?我觉得你应该稍微研究一下C数组和字符串。C数组比其他语言的数组更原始,比美化的指针稍多(例如,长度是静态的,不与数组一起存储).C字符串只是指向字符串的第一个字符的指针,字符串的结尾用0字节标记(大部分情况下,您都有责任在那里使用该字符)。@如果我继续使用strlen(fullArray),我就不明白您的解决方案我不是一直在添加1514吗?
strlen
计算从
fullArray
开始到第一个空字符的字符数。它不是
sizeof
。我建议不要使用
strlen
,因为
sprintf
已经返回了写入的字符数。@BlagovestBuyukliev,我写过关于t的在我的§2中,你可以通过使用sprintf的返回值来避免每次计算长度@贝诺特:啊,好的,我只是在看到前面提到的strlen后没有注意到。它起作用了,但我想知道,如果I==0,你在sprintf中输入,你在这里做什么好。然后你检查长度是否小于总长度。你定义字符a[10]?对于第一次迭代,我们必须将字符复制到数组中,因为数组未初始化。从第二次开始,只要您的fullarray未完全填充,您只需在所有迭代中追加检索到的值。因此,我们将在追加之前检查strlen。