虽然面试的时候,都会叫你不使用c库函数,自己完成某某函数的编写,但是库函数毕竟更让人信赖,我们没有任何理由怀疑库函数而使用自己的版本。不过当做练习,自己还是可以实现一下的。这里记录一下5th c primer附录中的可能用到的库函数。

  • size_t strlen (const char *s)返回字符串中字符的个数,不包括结束空字符(\0)。

eg:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h> int main(void)
{
char *p="abc";
char a[]={'a','b','\0'};
printf("%I64u %I64u\n",strlen(p),strlen(a));
return ;
}

  • char *strstr(const char *s1, const char *s2);

返回一个指针,它指向s1中第一次出现s2中字符序列的位置(不包含结束空字符),如果没有匹配则返回NULL。

eg:

#include <stdio.h>
#include <string.h> int main()
{
char *p1="abcdefg";
char *p2="defg";
char *p3="zxcvb";
char * temp;
if((temp=strstr(p1,p2))!=NULL)
{
printf("%s\n",temp);
}
else
{
printf("p2 not found!\n");
}
if((temp=strstr(p1,p3))!=NULL)
{
printf("%s\n",temp);
}
else
{
printf("p3 not found!\n");
}
return ;
}

  • size_t strspn(const char *s1, const char *s2);

strspn返回s1起始部分匹配s2中任意字符的字符数,一旦从起始部分开始,不能从s2中找到匹配的字符,就截断,返回前面匹配的总的字符

eg:

#include <stdio.h>
#include <string.h> int main()
{
char *p1="";
char *p2="";
char *p3="";
char *p4="";
char *p5=""; printf("%I64u %I64u %I64u %I64u\n",strspn(p2,p1),strspn(p3,p1),strspn(p4,p1),strspn(p5,p1));
return ;
}

linux源码中使用的为:strspn(nextWALFileName, "0123456789ABCDEF") == 24

wal日志文件名字为24位0-F字符组成tli+logid+segid("%08X%08X%08X", tli, log, seg),那么给出一个文件名,如何判断其是否符合上述规则?就可以使用strspn函数。

  • char *strrchr(char *string, int c);

在string指向的字符串中搜索c(转换成char)的最后一次出现,函数返回指向最后一个出现c的指针,如果没有找到则返回NULL.

eg:

#include<stdio.h>
#include <string.h>
#include <stdarg.h> int main()
{
char arr[]="aaaabqbccc";
char *s;
s=strrchr(arr,'b');
if(s!=NULL)
{
printf("found %c at %s\n",*s,s);
}
s=strrchr(arr,'w');
if(s==NULL)
{
printf("ont find !\n");
}
return();
}

  • void *memchr(const void *s, int c, size_t n);

The memchr function locates the first occurrence of c (converted to an unsigned
char) in the initial n characters (each interpreted as unsigned char) of the object
pointed to by s. The implementation shall behave as if it reads the characters sequentially
and stops as soon as a matching character is found.
Returns:
The memchr function returns a pointer to the located character, or a null pointer if the
character does not occur in the object.

#include <stdio.h>
#include <string.h>
int main(void)
{
int i;
char *ret_s;
char *s="aaabc";
ret_s=memchr(s,'b',);
for(i=;i<strlen(s);i++)
{
if(s[i]==*ret_s)
break;
}
printf("%c在第%d个位置出现。\n",*ret_s,i+);
return ;
}

数组下标从零开始的,实际位置加了1打印,这里数组下标为3,其实是第4个。

  • int memcmp(const void *s1, const void *s2, size_t n);

比较s1和s2所指向对象的前n个字符,如果都相等,返回0,出现第一个不等的地方,如果s1指向的数大于s2指向的数,返回大于0的数,如果小于,返回小于0的数。

对于这个库函数你是否表示费解,首先,有strcmp和strncmp库函数了,看到memcmp的函数声明是void*,我以为是可以比较任意类型的,比如int,float和double,那这个函数和strcnmp是不是重复了呢?

二者都可以用于字符串的比较,但是二者是有比较大的差异的,因为strncmp是按照字节(byte-wise)比较的,并且比较的过程中会检查是否出现了"\0"结束符,一旦任意一个字符串指针前进过程中遇到结束符,将终止比较。而memcmp函数是用于比较两个内存块的内容是否相等。如果要比较的对象中包含一些由于边界对齐需求而填入结构对象中的空格、联合 (union)结束的额外空格、字符串所分配的空间未使用完的部分引起的“holes”的话,最好使用memcmp来完成。这些“holes”(漏洞)的内容是不确定的,在执行byte-wise比较时结果也是不明确的。

memcmp是可以比较int,float,double,这和我预期吻合,不然它用void *干什么嘛!O(∩_∩)O哈哈~

虽然c标准说的是字符,但是测试非字符也行,这样才符合void *的声明的本意。

未完待续....

string.h中的库函数的更多相关文章

  1. 关于string.h中字符串的操作

     string.h中字符操作的函数 注意:**对字符数组的多次操作需要进行赋初值.或者善于用memset()函数进行清空数组的操作.**     否则容易出现错误. string.h文件中函数的用法加 ...

  2. C标准库string.h中几个常用函数的使用详解

    strlen 计算字符串长度 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符. 函数实现: int Strlen(cons ...

  3. C语言:自定义一个查找字串的功能函数,类似于<string.h>中的strstr()

    //自定义一个字符串字串查找标准库函数strstr() #include<stdio.h> #include<string.h> char* myStrstr(char *st ...

  4. C语言string.h中常用字符函数介绍

    原文:http://www.cnblogs.com/xuwenmin888/archive/2013/05/03/3057883.html strcpy 函数名: strcpy 功 能: 拷贝一个字符 ...

  5. 头文件string.h中的函数及使用方法

    来源:http://blog.csdn.net/tsyj810883979/article/details/5116817 字符串拷贝1 @函数名称:   strdup函数原型:   char *st ...

  6. 走进C标准库(8)——"string.h"中函数的实现相关字符串操作函数

    我的strcat: char *strcat(char *dest,char *src) { char * reval = dest; while(*dest) dest++; while(*src) ...

  7. 走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset

    我的memcmp: int memcmp(void *buf1, void *buf2, unsigned int count){ int reval; while(count && ...

  8. 走进C标准库(6)——"string.h"中函数的实现memchr

    我写的memchr: void *memchr(const void *buf, char ch, unsigned count){ unsigned ; while(*(buf++) != ch & ...

  9. C语言中的string.h中的内存字符串处理函数

    转载请注明出处:http://blog.csdn.net/zhubin215130/article/details/8993403 void *memcpy(void *dest, const voi ...

随机推荐

  1. Eclipse 如何创建Web项目

      Eclipse 如何创建Web项目 CreateTime--2018年3月8日16:43:33 Author:Marydon 第一步: 右键-->New-->Dynamic Web P ...

  2. SettingsEclipse

      迁移时间--2017年5月20日08:45:07 CreateTime--2016年11月15日11:07:44Author:Marydon --------------------------- ...

  3. 稀疏矩阵的加法(用十字链表实现A=A+B)

    描写叙述: 输入两个稀疏矩阵A和B,用十字链表实现A=A+B,输出它们相加的结果. 输入: 第一行输入四个正整数,各自是两个矩阵的行m.列n.第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数 ...

  4. js 获取地址栏的值乱码问题

    传过去的参数是:(01) 0 6936841 40029 4. 接收的参数的:'(01)%200%206936841%2040029%204'. 因为包含空格,或者中文,就会乱码.要想不乱码,接收的使 ...

  5. mysql 设置密码

    法一: 格式:mysqladmin -u用户名 -p旧密码 password 新密码 方法二:1.用root 进入mysql后mysql>set password =password('你的密码 ...

  6. 升级openssh基于openssl

    OpenSSH is the premier connectivity tool for remote login with the SSH protocol. It encrypts all tra ...

  7. MSSQL-SQL SERVER还原与备份(导入与导出)

    备份: 使用Microsoft SQL Server Management Studio查询出想要的列和结果, 在结果处左上角点击, 软件会自动选中查询出的所有结果, 然后右键"将结果另存为 ...

  8. 走进 Realm 的世界

    来源:XcodeMen(郭杰) 链接:http://www.jianshu.com/p/0e248f000405 本文由我们团队的郭杰童鞋分享. Realm是什么 Realm是由Y Combinato ...

  9. js调用父级frame中的方法

    父级frame中的方法: function hideOutline() { $("#outline").hide(); $("#content").attr(& ...

  10. Pandas dataframe 与 Spark dataframe 的区别

    区别 :http://www.voidcn.com/article/p-wsqbotem-boa.html 获取列名的列表: DataFrame.columns.values.tolist()