Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将未知长度的字符串与已知长度的字符串进行比较_C_C Standard Library - Fatal编程技术网

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
的前缀

  • 如果
    s1[s2_len]
    为NUL,则字符串相等
  • 如果不是:则
    strlen(s1)>s2_len
  • 如果
    strncmp()
    返回非零,则跳过第二次测试(短电路评估)

您可以使用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