string.h中的库函数
虽然面试的时候,都会叫你不使用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中的库函数的更多相关文章
- 关于string.h中字符串的操作
string.h中字符操作的函数 注意:**对字符数组的多次操作需要进行赋初值.或者善于用memset()函数进行清空数组的操作.** 否则容易出现错误. string.h文件中函数的用法加 ...
- C标准库string.h中几个常用函数的使用详解
strlen 计算字符串长度 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符. 函数实现: int Strlen(cons ...
- C语言:自定义一个查找字串的功能函数,类似于<string.h>中的strstr()
//自定义一个字符串字串查找标准库函数strstr() #include<stdio.h> #include<string.h> char* myStrstr(char *st ...
- C语言string.h中常用字符函数介绍
原文:http://www.cnblogs.com/xuwenmin888/archive/2013/05/03/3057883.html strcpy 函数名: strcpy 功 能: 拷贝一个字符 ...
- 头文件string.h中的函数及使用方法
来源:http://blog.csdn.net/tsyj810883979/article/details/5116817 字符串拷贝1 @函数名称: strdup函数原型: char *st ...
- 走进C标准库(8)——"string.h"中函数的实现相关字符串操作函数
我的strcat: char *strcat(char *dest,char *src) { char * reval = dest; while(*dest) dest++; while(*src) ...
- 走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset
我的memcmp: int memcmp(void *buf1, void *buf2, unsigned int count){ int reval; while(count && ...
- 走进C标准库(6)——"string.h"中函数的实现memchr
我写的memchr: void *memchr(const void *buf, char ch, unsigned count){ unsigned ; while(*(buf++) != ch & ...
- C语言中的string.h中的内存字符串处理函数
转载请注明出处:http://blog.csdn.net/zhubin215130/article/details/8993403 void *memcpy(void *dest, const voi ...
随机推荐
- Eclipse debug模式 总是进入processWorkerExit
Eclipse debug模式 总是进入processWorkerExit CreateTime--2018年3月9日15:44:59 Author:Marydon 请移步至文章:http://w ...
- 简单的 Helper 封装 -- CookieHelper
using System; using System.Web; namespace ConsoleApplication5 { /// <summary> /// Cookie 助手 // ...
- .NET Remoting三种信道Http,Tcp,IPC和Web Service的访问速度比较(转)
Remoting和Web Service是.net中的重要技术,都可用来实现分布式系统开发,如果是不同的平台就只能选择Web Service,但如果是同一平台,就都可以选择了.到底选择那种,当然还有访 ...
- CentOS下安装IDE -- QTCreator
月底,美国的大佬们将会过来给我们几个搞一个培训.老大要求我们提前学习一下Qt. 我现在的首要任务是在自己的CentOS系统上安装一下Qt开发环境. 1. 获取下载地址 Qt的官网是:http://qt ...
- ArchLinux新版本(pacstrap安装)及国内较优源推荐
下载安装镜像和配置虚拟机都略过. 进入安装模式以后第一件事是要进行分区,分区很重要,怎么分区是由后面的grub的模式来决定的.grub有3种模式,分别对应grub-bios-gpt,grub-bios ...
- Foundations of Machine Learning: The Margin Explanation for Boosting's Effectiveness
Foundations of Machine Learning: The Margin Explanation for Boosting's Effectiveness 在这一节,我们要回答的一个问题 ...
- 批量修改Java类文件中引入的package包路径
http://libeey.blogbus.com/logs/101848958.html当复制其他工程中的包到新工程的目录中时,由于包路径不同,出现红叉,下面的类要一个一个修改包路径,类文件太多的话 ...
- UE 技巧
http://cache.baiducontent.com/c?m=9d78d513d98416b8599d830e7c01a7170e2585744ddcc4523f8a9c12d522195646 ...
- qsort函数、sort函数
先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有 ...
- Android性能优化之被忽视的Memory Leaks
起因 写博客就像讲故事.得有起因,经过,结果,人物.地点和时间.今天就容我给大家讲一个故事. 人物呢.肯定是我了. 故事则发生在近期的这两天,地点在coder君上班的公司.那天无意中我发现了一个奇怪的 ...