我想比较一个未知长度的以空字符结尾的字符串 ( s1
) 和一个已知长度的未终止字符串 ( s2
)。
!strncmp(s1, s2, s2_len)
s2
接近正确,但如果是 的前缀,也变为真s1
。
strlen(s1) == s2_len && !strcmp(s1, s2)
是正确的,但扫描s1
两次。
显然,手动比较字符串也可以,但让我失去了 C 库在过去四十年中获得的所有闪亮优化。
有没有用 C 库函数实现这一点的好方法?
我想比较一个未知长度的以空字符结尾的字符串 ( s1
) 和一个已知长度的未终止字符串 ( s2
)。
!strncmp(s1, s2, s2_len)
s2
接近正确,但如果是 的前缀,也变为真s1
。
strlen(s1) == s2_len && !strcmp(s1, s2)
是正确的,但扫描s1
两次。
显然,手动比较字符串也可以,但让我失去了 C 库在过去四十年中获得的所有闪亮优化。
有没有用 C 库函数实现这一点的好方法?
if (!strncmp(s1, s2, s2_len) && s1[s2_len] == 0) {...}
如果strncmp()
返回零,则s2
是 的前缀s1
。
s1[s2_len]
为 NUL,则字符串相等strlen(s1) > s2_len
strncmp()
返回非零,则跳过第二个测试(短路评估)您可以使用 strncmp 方法并检查 NUL 终止符s1
:
!strncmp(s1, s2, s2_len) && !s1[s2_len]
如果strncmp(s1, s2, s2_len)
返回0
您知道s1
至少与 一样长s2
,那么您只需检查终止符以排除s2
作为前缀的可能性s1
:
if (!strncmp(s1, s2, s2_len) && s1[s2_len] == '\0') {
// ...
}