这些函数都必须 #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”。