虽然面试的时候,都会叫你不使用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. Codeforces554C:Kyoya and Colored Balls(组合数学+费马小定理)

    Kyoya Ootori has a bag with n colored balls that are colored with k different colors. The colors are ...

  2. Mybatis日期类型的关系判断

    进行时间段的查询时,在mapper文件中直接使用">","<"等关系运算符是无法解析的 <if test="executeStart ...

  3. 创建表时 ORA-00955: 名称已由现有对象使用

    如下,在执行创建表语句时报错如下: 执行下面sql查询 select a.OBJECT_type,a.* from all_objects a where upper(a.OBJECT_NAME) = ...

  4. [译]为什么Vue不支持templateURL

    原文链接 Vue的新用户最常问的一个问题,特别是以前使用Angular的用户,是"我可以使用" templateURL吗?这个问题我回答过很多次,现在写一个统一回复. 在Angul ...

  5. 【LeetCode】71. Simplify Path

    Simplify Path Given an absolute path for a file (Unix-style), simplify it. For example,path = " ...

  6. AP_标准采购单付基本操作(流程)

    2014-06-04 Created By BaoXinjian

  7. Singleton - 单例模式和Double-Checked Locking - 双重检查锁定模式

    问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能:在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进 ...

  8. 怎样让VMware上的虚拟机ping通外网(图解教程)

    近期在实习项目中遇到一个问题. 因測试须要,本人在win7上安装VMWare后在启动两台ubuntuserver.两台主机的网络配置所有採用NAT方式实现连接. 之后一路畅通.主机ping通虚拟机和外 ...

  9. this 与 super 反复问题?

    我们都知道 this  和 super keyword,在 调用 构函数的时候, 都必须写在第一行中. this 调用的是当前的类的构造函数. super 调用的是父类的构造函数! this和supe ...

  10. Spark与Pandas中DataFrame对比

      Pandas Spark 工作方式 单机single machine tool,没有并行机制parallelism不支持Hadoop,处理大量数据有瓶颈 分布式并行计算框架,内建并行机制paral ...