C 将未知长度的字符串与已知长度的字符串进行比较
我想比较长度未知(C 将未知长度的字符串与已知长度的字符串进行比较,c,c-standard-library,C,C Standard Library,我想比较长度未知(s1)的空终止字符串和长度已知(s2)的未终止字符串 !strncmp(s1,s2,s2_len)接近正确,但如果s2是s1的前缀,则也将变为true strlen(s1)=s2_len&!strcmp(s1,s2)正确,但扫描了s1两次 显然,手动比较字符串也很有效,但是我失去了C库在过去四十年中获得的所有闪亮的优化 使用C库函数是否有一个很好的方法来实现这一点?如果strncmp(s1,s2,s2_len)返回0您知道s1至少与s2一样长,那么您可以检查终止符,以排除s2是
s1
)的空终止字符串和长度已知(s2
)的未终止字符串
!strncmp(s1,s2,s2_len)
接近正确,但如果s2
是s1
的前缀,则也将变为true
strlen(s1)=s2_len&!strcmp(s1,s2)
正确,但扫描了s1
两次
显然,手动比较字符串也很有效,但是我失去了C库在过去四十年中获得的所有闪亮的优化
使用C库函数是否有一个很好的方法来实现这一点?如果strncmp(s1,s2,s2_len)
返回0
您知道s1
至少与s2
一样长,那么您可以检查终止符,以排除s2
是s1
前缀的可能性:
if (!strncmp(s1, s2, s2_len) && s1[s2_len] == '\0') {
// ...
}
!strncmp(s1, s2, s2_len) && !s1[s2_len]
如果
strncmp()
返回零,则s2
是s1
的前缀
- 如果
为NUL,则字符串相等s1[s2_len]
- 如果不是:则
strlen(s1)>s2_len
- 如果
返回非零,则跳过第二次测试(短电路评估)strncmp()
s1
中检查NUL终止符:
if (!strncmp(s1, s2, s2_len) && s1[s2_len] == '\0') {
// ...
}
!strncmp(s1, s2, s2_len) && !s1[s2_len]
第一个。但在这之后,你还必须测试
s1[s2_len]==0
。@wildplasser这似乎值得作为一个实际的答案发布在这里…只是一个简单的例子:“…使用C库函数”可能是因为库函数比用普通C编写的等效函数更适合您的机器。但是:您正在组合两个库函数。组合函数是否仍比具有2个测试条件的简单循环快(如果我算对的话)?@usr2564301,编译器可以用自己的版本(在托管环境中)替换多个标准函数,这些版本通常具有额外的优化(例如,对于固定字符串,strlen
)。请不要将字符串结尾s1
的测试移到前面好吗?这是一个重要的限制因素。(补充)啊,等等。此时,s1
的长度仍然未知。对。:)因为s1可以比s2_len短。@usr2564301:除非您知道字符串至少有那么长,否则不适合访问s1[s2_len]
。如果s2\u len
为10,并且s1
在s1[3]
处有一个空字节,则访问s1[4]
或更高版本可能具有未定义的行为。同上。如果s1[s2_len]!='\不应执行0的strncmp