将未知长度的字符串与已知长度的字符串进行比较
Compare string of unknown length against string of known length
我想将未知长度 (s1
) 的空终止字符串与已知长度 (s2
) 的未终止字符串进行比较。
!strncmp(s1, s2, s2_len)
接近正确,但如果 s2
是 s1
.
的前缀,也会计算为真
strlen(s1) == s2_len && !strcmp(s1, s2)
是正确的,但扫描 s1
两次。
显然,手动比较字符串也可以,但我失去了 C 库在过去四十年中获得的所有闪亮优化。
有没有用C库函数实现这个的好方法?
如果 strncmp(s1, s2, s2_len)
returns 0
你知道 s1
至少和 s2
一样长,那么你可以检查一下终止符以排除 s2
是 s1
:
的前缀的可能性
if (!strncmp(s1, s2, s2_len) && s1[s2_len] == '[=10=]') {
// ...
}
if (!strncmp(s1, s2, s2_len) && s1[s2_len] == 0) {...}
如果strncmp()
returns为零,则s2
是s1
的前缀。
- 如果
s1[s2_len]
为 NUL,则 字符串 相等
- 如果不是:那么
strlen(s1) > s2_len
- 如果
strncmp()
returns 非零,则跳过第二个测试(short-cicuit 评估)
您可以使用 strncmp 方法并在 s1
:
中检查 NULL 终止符
!strncmp(s1, s2, s2_len) && !s1[s2_len]
我想将未知长度 (s1
) 的空终止字符串与已知长度 (s2
) 的未终止字符串进行比较。
!strncmp(s1, s2, s2_len)
接近正确,但如果 s2
是 s1
.
strlen(s1) == s2_len && !strcmp(s1, s2)
是正确的,但扫描 s1
两次。
显然,手动比较字符串也可以,但我失去了 C 库在过去四十年中获得的所有闪亮优化。
有没有用C库函数实现这个的好方法?
如果 strncmp(s1, s2, s2_len)
returns 0
你知道 s1
至少和 s2
一样长,那么你可以检查一下终止符以排除 s2
是 s1
:
if (!strncmp(s1, s2, s2_len) && s1[s2_len] == '[=10=]') {
// ...
}
if (!strncmp(s1, s2, s2_len) && s1[s2_len] == 0) {...}
如果strncmp()
returns为零,则s2
是s1
的前缀。
- 如果
s1[s2_len]
为 NUL,则 字符串 相等 - 如果不是:那么
strlen(s1) > s2_len
- 如果
strncmp()
returns 非零,则跳过第二个测试(short-cicuit 评估)
您可以使用 strncmp 方法并在 s1
:
!strncmp(s1, s2, s2_len) && !s1[s2_len]