【问题标题】:Remove trailing NULL terminator删除尾随 NULL 终止符
【发布时间】:2014-09-26 22:25:21
【问题描述】:

我有一个用 0 填充的大型 char 数组。我从套接字读取传入文件并将其内容放在缓冲区中。我无法写入包含所有 '\0' 的缓冲区,因此我分配了一个具有正确大小的新缓冲区并进行写入。 我使用这种方法来做到这一点:

int i = 0;
while(buf[i] != '\0'){
    i++;
}
char new[i];
while(i){
    new[i] = buf[i];
    i--;
}
new[0] = buf[0];

虽然这种方法有效,但它似乎不是最聪明或最优雅的方法。从 char 数组中删除所有尾随 NULL 字符的最佳方法是什么?

【问题讨论】:

  • “删除”是什么意思?所有数组元素都有一个值。也许realloc 是你需要的?
  • 我认为你不太明白这一点。您可以从您拥有的缓冲区写入,您只需要知道它的活动长度。
  • 我不是说删除,我正在创建一个不同长度的新缓冲区来保存文件。
  • 我支持两个 cmets。首先,您需要澄清“删除”的含义。其次,您应该考虑一种替代方法,例如将缓冲区写入文件直到第一个空值。
  • 那些字节已经在内存中分配了,你不能“删除”那些。您可以分配一个所需大小的新数组......但没有必要这样做。从已分配的数组中仅复制所需的字节数。 (重新分配另一个数组并复制到该数组是不必要的,当您“写入本地文件”时,复制操作已经执行。

标签: c string null-terminated


【解决方案1】:

我想更简单的方法是:

size_t len = strlen(buf); // will calculate number of non-0 symbols before first 0
char * newBuf = (char *)malloc(len); // allocate memory for new array, don't forget to free it later
memcpy(newBuf, buf, len); // copy data from old buf to new one

【讨论】:

  • 是的。但是为什么需要执行该操作呢?
  • @spencer7593 如果原始缓冲区进一步重新用于套接字操作是有意义的
  • 完美,我完全忘记了 strlen。
  • 在网络代码中忘记 strlen() 通常是个好主意。
【解决方案2】:

我的第一个想法是:计算从流中接收到的字符数,然后一次将相应数量的字节写入文件。

如果不可能,我们会采用不太聪明的方法:

int i = BUFFER_SIZE - 1;
while((i>=0) && (buffer[i--] == '\0'));
++i;

之后,i 包含缓冲区的长度。

【讨论】:

  • 正如您所写的“我从套接字读取传入文件” - 这可能是任意数据,strlen() 无法正常工作。以后请更准确。
【解决方案3】:

您可以利用 NULL 属性。 只需复制没有 NULL 字符的此数据。像这样 len = strlen(buf); // 它将确保您只读取 total_char + 1 现在只将此缓冲区中的 len-1 字符复制到文件中。如果你愿意,你也可以准备新的缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2015-04-03
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多