2

我想比较一个未知长度的以空字符结尾的字符串 ( s1) 和一个已知长度的未终止字符串 ( s2)。

!strncmp(s1, s2, s2_len)s2接近正确,但如果是 的前缀,也变为真s1

strlen(s1) == s2_len && !strcmp(s1, s2)是正确的,但扫描s1两次。

显然,手动比较字符串也可以,但让我失去了 C 库在过去四十年中获得的所有闪亮优化。

有没有用 C 库函数实现这一点的好方法?

4

3 回答 3

4
if (!strncmp(s1, s2, s2_len) && s1[s2_len] == 0) {...}

如果strncmp()返回零,则s2是 的前缀s1

  • 如果s1[s2_len]为 NUL,则字符串相等
  • 什么时候不:那么strlen(s1) > s2_len
  • 如果strncmp()返回非零,则跳过第二个测试(短路评估)
于 2020-02-16T17:47:37.387 回答
2

您可以使用 strncmp 方法并检查 NUL 终止符s1

!strncmp(s1, s2, s2_len) && !s1[s2_len]
于 2020-02-16T18:30:55.533 回答
2

如果strncmp(s1, s2, s2_len)返回0您知道s1至少与 一样长s2,那么您只需检查终止符以排除s2作为前缀的可能性s1

if (!strncmp(s1, s2, s2_len) && s1[s2_len] == '\0') {
    // ...
}
于 2020-02-16T17:47:05.190 回答