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

标签 c string null strcpy

本质上,我正在标记一个字符串并将找到的字符串 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/

相关文章:

c++ - C语言打印时如何对浮点类型变量进行舍入?

Python:如何不在for循环的最后一个元素中打印逗号?

php - 如何获取特定列中值为 null 的记录?

c - C 的定时器非常精确?如此精确地测量单个函数调用

c - C 中位域结构的大小

Java:在没有内置方法 contains() 的情况下实现 String 方法 contains()

c++ - 编译器错误 : does not name a type

c++ - 以 Null 结尾的字符串的 "NULL"或 "\0"符号是否存储在文件中?

java - HtmlUnit 空指针异常

c - _Generic 结合可变参数函数?