几个C库string函数及其注意事项

这些函数都必须 #include <string.h>
这周突然和C库string处理函数杠上了。说这个不是没有原因,其一是公司项目要求提升I/O的performance,原先使用C++的getline每次读取一个6M的文件直到读完为止,网上资料查到使用fget并配以strtok能大幅提升效率;其二正自学到《Linux高性能服务器编程》的第8章,其例子用的是原生C库函数来对http的request进行解析,自然也涉及到一大波的str操作。

对所用函数以及基本char*操作做个记录以backup:

char *strstr(const char *haystack, const char *needle);
 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。

char *strtok(char s[], const char *delim);
参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。
返回指向被分割出片段的指针。但要主要一点,如果有连续分隔符则会跳过其中的空白信息,需另行处理。

char *strpbrk(const char *s1, const char *s2);
依次检验字符串s1中的字符,当被检验字符在字符串s2中也包含时,则停止检验。
返回该字符位置,空字符null不包括在内。

size_t strspn (const char *s,const char * accept);
从参数s字符串的开头计算连续的字符,而这些字符都完全是accept 所指字符串中的字符。简单的说,若strspn()返回的数值为n,则代表字符串s 开头连续有n 个字符都是属于字符串accept内的字符。
返回字符串s开头连续包含字符串accept内的字符数目。

char *strchr(const char *str, int c)
在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置。
该返回在字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL。

int strcmp(const char *s1,const char *s2);
两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
当s1<s2时,返回为负数;
当s1=s2时,返回值= 0;
当s1>s2时,返回正数。

--------------------分割线--------------------

这段代码不去debug真的搞不清干啥用:

char temp[] = "GET http://www.baidu.com/index.html HTTP/1.0";
char* url = strpbrk(temp, " \t");
url++='\0';

这段代码等价于

*url = '\0';
url++;

因为++的优先级是高于*的,但由于是后++,所以在这里可以把++的优先级看成小于*。因此先执行*ptr='\0',再执行ptr++。
因此url由指向整个temp编程了指向“GET”后面的空格,替换掉“\0”后,原先temp变为“GET”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值