将未知长度的字符串与已知长度的字符串进行比较

Compare string of unknown length against string of known length

我想将未知长度 (s1) 的空终止字符串与已知长度 (s2) 的未终止字符串进行比较。

!strncmp(s1, s2, s2_len) 接近正确,但如果 s2s1.

的前缀,也会计算为真

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

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

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

如果 strncmp(s1, s2, s2_len) returns 0 你知道 s1 至少和 s2 一样长,那么你可以检查一下终止符以排除 s2s1:

的前缀的可能性
if (!strncmp(s1, s2, s2_len) && s1[s2_len] == '[=10=]') {
    // ...
}
if (!strncmp(s1, s2, s2_len) && s1[s2_len] == 0) {...}

如果strncmp() returns为零,则s2s1的前缀。

  • 如果 s1[s2_len] 为 NUL,则 字符串 相等
  • 如果不是:那么 strlen(s1) > s2_len
  • 如果 strncmp() returns 非零,则跳过第二个测试(short-cicuit 评估)

您可以使用 strncmp 方法并在 s1:

中检查 NULL 终止符
!strncmp(s1, s2, s2_len) && !s1[s2_len]