gpt4 book ai didi

c - strncmp() 表达式中的 strlen() 是否会破坏在 strcmp() 上使用 strncmp() 的目的?

转载 作者:太空狗 更新时间:2023-10-29 14:51:18 26 4
gpt4 key购买 nike

据我了解,strcmp()(无“n”)在任一参数中看到空字符后,立即停止处理并返回结果。
因此,如果已知 100% 确定其中一个参数以 null 结尾(例如,它是一个字符串文字),则使用 strncmp()(使用 'n' ) 调用 strlen() 作为第三个参数的一部分,以限制与已知字符串长度的比较,因为 strcmp() 永远不会读取比现在更多的字符在那个已知终止字符串中。

事实上,在我看来,对前两个参数之一的长度参数是 strlen()strncmp() 的调用与strcmp() 的情况,因为它通过计算 strlen() 表达式来浪费与已知终止字符串的大小成线性关系的时间。

考虑:

示例代码A:

if (strcmp(user_input, "status") == 0)
reply_with_status();

示例代码B:

if (strncmp(user_input, "status", strlen("status")+1) == 0)
reply_with_status();

前者比后者有什么好处吗?因为我在其他人的代码中看到它很多

我是否对这些功能的工作原理有错误的理解?

最佳答案

在您的特定示例中,我认为使用 strncmp 是有害的,因为:

  • 无论如何都使用 strlen 进行扫描
  • 重复字符串文字"status"
  • 加 1 以确保字符串确实相等

所有这些都增加了困惑,并且在任何情况下,如果 user_input 确实短于 6 个字符并且包含与测试字符串相同的字符,那么您将不会受到溢出的保护。

那将是异常(exception)。如果您知道输入字符串的内存总是多于测试字符串中的字符数,那么不用担心。否则,您可能需要担心,或者至少考虑一下。 strncmp 可用于测试大缓冲区内的内容。

我更喜欢代码的可读性。

关于c - strncmp() 表达式中的 strlen() 是否会破坏在 strcmp() 上使用 strncmp() 的目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14885000/

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