始终将 strtok_s 的第一个参数保持为 NULL 是否正确?

Tinggo

我曾经考虑过第一次调用时strtok_s()应该将包含令牌的字符串作为第一个参数传递,如下代码:

char testString[100] = "1|2|3";
char *context = testString;
const char *token = strtok_s( testString, "|", &context );
while ( token )
    token = strtok_s( NULL, "|", &context );

但是,我看到有人总是将第一个参数保留为NULL,例如以下代码:

char testString[100] = "1|2|3";
char *context = testString;
const char *token = strtok_s( NULL, "|", &context );
while ( token )
    token = strtok_s( NULL, "|", &context );

我知道它的工作原理以及它是如何工作的。因为context指向与testString. 但我觉得有点奇怪,我的疑问是:

  1. 这是使用的好习惯strtok_s()吗?它可能面临哪些潜在的错误?
  2. 如果这是一个好的做法,为什么strtok_s()还需要保留第一个参数?它可以NULL像往常一样,不是吗?
保罗92

根据函数文档该函数的正确用法是您提到的第一个。

进一步引用 C11 标准(强调我的),第 K.3.7.3.1 节(第 616 页):

  1. 对 strtok_s 函数的调用序列将 s1 指向的字符串分解为一系列标记,每个标记都由 s2 指向的字符串中的一个字符分隔。第四个参数指向调用者提供的 char 指针,strtok_s 函数在其中存储它继续扫描同一个 string 所需的信息

  2. 序列中的第一个调用有一个非空的第一个参数,s1max 指向一个对象,该对象的值是第一个参数指向的字符数组中的元素数。第一次调用在 ptr 指向的对象中存储一个初始值,并更新 s1max 指向的值以反映与 ptr 相关的剩余元素数。序列中的后续调用的第一个参数为 null,并且 s1max 和 ptr 指向的对象需要具有序列中前一个调用存储的值,然后更新这些值s2 指向的分隔符字符串可能与调用不同。

因此,标准所说的正​​确用法是strtok_s使用非 NULL 第一个参数调用,然后使用 NULL 第一个参数调用它。在第一次调用时,该函数初始化一些状态,并使用提供的指针(最后一个参数)来存储它。

该标准没有提到应该如何使用最后一个参数,而不是保持状态,以便在使用未修改的指针调用时函数可以继续搜索相同的字符串基本上,它消除了对 的内部状态的需要strtok,例如,您可以同时标记多个字符串。

因此,状态空间的使用方式是实现定义的很可能是这样,在某些实现中,它可以简单地将初始字符串放在那里,并始终使用第一个参数 NULL 调用它,如您所示。但是不能保证这会发生在所有实现上,或者这种行为在库的未来版本中将保持不变。

直接回答您的问题,是的,它可能有效,但不,这样做不是一个好主意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

始终将NULL排序为空字符串或0

strtok_s 忽略第一个字符

strtok_s 在windbg 中返回不正确的数据

是否应始终将默认设置为None的参数类型提示为Optional []?

使用 th:inline 设置 thymeleaf 变量始终将变量设置为 null

插入Map中的第一个元素始终被读取为null

当期望使用元组类型参数时,是否可以始终将列表类型用作函数参数?

是否可以始终将无模形式保持在最前面?

对于PowerShell cmdlet,是否可以始终将脚本块传递给字符串参数?

Bash:“ if”语句始终将第一个条件评估为“ true”,即使为“ false”也是如此

setText()方法是否始终将值设置为字符串?

我是否应该始终将结构属性定义为可测试性的接口?

当我在C ++中使用auto bi = 123456789时,是否始终将其分配为int?

如何始终将元素放在第一个位置?

SORTC始终将数组的第一个元素移到末尾

按字母顺序排序始终将所有文本作为第一个选项

我应该在MySQL数据库中始终将默认值设置为NULL吗?

Sirikit始终将美元显示为货币

始终将JSON解析为数组

PostgresQL:是否始终将整个事务写入复制插槽?

Java:是否应该始终将Array替换为ArrayList?

是否应始终将条件绑定用于使单元出队

如何始终将div保持在底部,而又不阻止另一个div?

无法构造“ Blob”:提供的第一个参数为null或无效的Array对象。

strncat()是否始终为null终止?

如何在滚动时始终将标题保持在顶部?

Javascript始终将边栏保持在100vh

tkinter 在 MacOS 上始终将窗口保持在顶部

保持ListBox排序,但始终将特定条目固定在顶部