gpt4 book ai didi

C:如何以更简洁的方式将空终止符复制到结构成员?

转载 作者:太空宇宙 更新时间:2023-11-04 01:40:45 24 4
gpt4 key购买 nike

本质上,我正在标记一个字符串并将找到的字符串 strncpy 转换为结构成员,即 stringid。它当然有缺少终止的问题,我为它添加了一个额外的数组空间,我不知道如何正确添加它。

我是这样做的:

my_struct[iteration].stringID[ID_SIZE-1] = '\0' //updated

我不确定这是否真的有效,IMO 看起来很糟糕。

Str(n)cpying 空字符或 0 会导致 GCC 和 MinGW 生成警告:

warning: null argument where non-null required (arg 2)

我是否对如何以干净的方式执行此操作视而不见?我正在考虑将成员数组 memsetting 为全零,然后复制字符串以很好地适应 null 终止。您有什么建议或做法吗?

最佳答案

两件事:

  1. 请注意 strncpy() 具有意想不到的语义,如果字符串未完全填满,它将始终以 0 填充缓冲区,如果缓冲区完全填满,它也不会终止字符串。这两个都很奇怪,我建议不要使用它。
  2. 永远不要用它的大小索引一个数组,就像 stringID[ID_SIZE] 似乎在做的那样;那是越界的。

最好的解决方案是编写一个不太奇怪的 strncpy() 的自定义版本,或者(如果您知道输入的长度)只使用 strcpy().

更新:如果您的输入 token 的长度是静态的,但由于您的 token 化过程,它们在源缓冲区中不是以 0 结尾的,那么只需使用 memcpy() 和手动终止:

const char * token = ...; /* Extract from tokenization somehow. Not 0-terminated. */
const size_t token_length = ... /* Perhaps from tokenization step. */
memcpy(my_struct[iteration].stringID, token, token_length);
my_struct[iteration].stringID[token_length] = '\0';

我认为没有必要将上述内容“包装”在宏中。

关于C:如何以更简洁的方式将空终止符复制到结构成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5883066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com