本质上,我正在标记一个字符串并将找到的字符串 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 终止。您有什么建议或做法吗?
最佳答案
两件事:
- 请注意
strncpy()
具有意想不到的语义,如果字符串未完全填满,它将始终以 0 填充缓冲区,如果缓冲区完全填满,它也不会终止字符串。这两个都很奇怪,我建议不要使用它。 - 永远不要用它的大小索引一个数组,就像
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/