我不明白strnlen()的实际用途是什么。任何人都可以让我知道实际用途或指向我可以找到真正用途的链接吗?
答案 0 :(得分:6)
使用strnlen查找可能不包含零的字符串的长度。
例如,您可能有一个从网络读入的字节缓冲区。缓冲区应该包含一个字符串。但它可能不会!在这个例子中,你不想通过在末尾写一个零来修改缓冲区,所以你使用strnlen来查找它的长度为字符串。
答案 1 :(得分:6)
strnlen
有两个主要用途:
您的输入是一个字符数组,如果内容填满整个数组,并且您想确定"字符串"的长度,则该字符数组可能不会以空值终止。 (不是C字符串)。
接口合同保证您的输入是有效的C字符串,但是没有大小限制,并且您希望对大小施加限制而不消耗不成比例的处理资源来计算大小来检查它违反你的限制。
在我看来,情况1不太有趣,因为你通常可以通过使缓冲区大一个字节来处理它,并且总是在最后一个字节中存储一个终结符。案例2更有趣。例如,如果您的函数以:
开头if (strlen(input) >= 256) return error_code;
如果有人将100GB字符串作为input
传递,则可能需要很多秒(甚至几分钟)才能返回错误,尽管在读取前256个字节后已经知道应该返回错误。另一方面,如果你写:
if (strnlen(input, 256) >= 256) return error_code;
然后该功能总是可以快速返回。请注意,这种转换实际上可以由编译器自动应用;在未来,幸运的是,它可能是。
答案 2 :(得分:2)
strnlen()是一个更安全的strlen()版本。
假设你有一个c-string的缓冲区,其中由于某种原因没有结束' \ 0'。 strlen()会溢出缓冲区的限制。运气不错可能会出现段错误,但更可能的是,它会返回错误的长度。如果使用此长度,您的代码的其余部分可能会导致错误。
使用strnlen(),您可以通过将legth限制为缓冲区的最大值来限制风险。
答案 3 :(得分:0)
用于确定已知大小的缓冲区中零终止字符串的长度。
编辑:在该缓冲区内没有终止零的情况下,这与strlen不同。按设计(缓冲区刚满)或意外(忘记终结者,或被黑客入侵,......)