在C语言中实现追加的正确方法

3
我正在捕获十六进制值的数据包,我想将它们存储到已定义的数组中。最后,当我执行 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); 

需要更新缓冲区地址以使用sprintf;另外snprintf更安全。 - Sam Liao
@Arsane,我的代码应该改怎么样呢?我有点迷茫。 - user2711681
2
我认为你应该稍微学习一下C语言的数组和字符串。C语言的数组比其他语言的数组更原始,仅仅是一个被美化过的指针(例如长度是静态的,不会与数组一起存储)。C语言的字符串只是指向字符串第一个字符的指针,并且字符串的结尾由0字节标记(大多数情况下需要你自己添加)。 - hyde
2个回答

4

sprintf在fullArray开头输出。

如果你想在其后添加,应该使用sprintf(fullArray + strlen(fullArray), ...)查找空字符。你可以通过使用sprintf的返回值来避免每次计算长度。

strcat不支持类似printf的格式化。所以你可以使用sprintf到一个临时缓冲区,然后使用strcat将该缓冲区复制到fullArray的末尾。

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

在下面的示例中,我保存了两个变量:指向下一个写入位置的指针和剩余可用大小的缓冲区。每次调用snprintf,它都不会写入超出缓冲区的末尾,我使用它的返回值来更新这两个变量。至少必须保留1个字节来容纳最终的\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;
}

如果我一直这样做strlen(fullArray),那么我不明白你的解决方案,难道我不会一直添加1514吗? - user2711681
不,strlen 函数计算的是从 fullArray 开始到第一个 NULL 字符的字符数,而不是 sizeof - Benoit
@user2711681:虽然仍然正确,但效率不会那么高。 - Blagovest Buyukliev
到目前为止,Vijay提出的建议也很有效。 - user2711681
@Benoit 如果我想将这些十六进制值转换为人类可读的形式,我尝试了 printf("%c\n", p[i]); 但是输出结果不太好。 - user2711681
显示剩余6条评论

1

你的代码将导致数组中只有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,你将其放入sprintf中。然后下一步检查长度是否小于总长度。你定义的char a[10]是什么? - user2711681
对于第一次迭代,我们必须将字符复制到数组中,因为该数组未初始化。从第二次开始,只需在所有迭代中附加检索到的值,前提是您的fullarray没有完全填满。因此,在附加之前,我们将检查strlen。 (注:在翻译过程中请注意编程术语的准确翻译) - Vijay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接