在标准C库中是否有大约startsWith(str_a, str_b)个?

它应该接受指向两个以空字节结尾的字符串的指针,并告诉我第一个字符串是否也完全出现在第二个字符串的开头.

例如:

"abc", "abcdef" -> true
"abcdef", "abc" -> false
"abd", "abdcef" -> true
"abc", "abc"    -> true

推荐答案

显然,这方面没有标准的C函数.因此:

bool startsWith(const char *pre, const char *str)
{
    size_t lenpre = strlen(pre),
           lenstr = strlen(str);
    return lenstr < lenpre ? false : memcmp(pre, str, lenpre) == 0;
}

注意,上面的代码清晰明了,但是如果您是在一个紧密的循环中执行,或者处理very个大字符串,那么它不会提供最佳的性能,因为它会提前扫描两个字符串的全长(strlen).像wj32'sChristoph's这样的解决方案可能会提供更好的性能(虽然Fred Foo's solution8?noredirect=1#comment50194475_4771386">this comment关于矢量化超出了我的C知识).另请注意Fred Foo's solution,这避免了strstrlen(他是对的,如果您使用strncmp而不是memcmp,就没有必要了).只对(非常)大的字符串或在紧密循环中重复使用才重要,但当它重要时,它就很重要.

C++相关问答推荐

变量的const视图是否定义良好?

C:gcc返回多个错误定义,但msvc—不""'

sizeof结果是否依赖于字符串的声明?

为什么可以通过指向常量int的指针间接地改变整数的值?

我应该如何解决我自己为iOS编译的xmlsec1库的问题?转换Ctx.first在xmlSecTransformCtxPrepare()之后为空

正在try 将文件/文件夹名从目录 struct 存储到链接列表

为什么C语言允许你使用var =(struct NAME){

将常量转换为指针会增加.数据大小增加1000字节

如何在c++中包装返回空*的函数

插座打开MacOS组件

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

仅从限制指针参数声明推断非混叠

如何使这个While循环在新行上结束

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

C中的空指针是什么(_N)?

令人困惑的返回和 scanf 问题相关

execve 不给出which命令的输出

将指针的地址加载到寄存器内联拇指组件中

为什么需要struct in_addr

段错误try 访问静态字符串,但仅有时取决于构建环境