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 ...
随机推荐
- JSP常用跳转方式
常用的跳转方式有以下几种: (1)href超链接标记,属于客户端跳转 (2)使用JavaScript完成,属于客户端跳转 (3)提交表单完成跳转,属于客户端跳转 (4)使用response对象,属 ...
- ContextMenu上下文菜单
上下文菜单一般是真针对ListView(多条数据的操作) 需求:在ListView中显示通话记录的电话号码,长按显示的上下文菜单为复制号码到拨号盘.发送信息.复制号码,与之相对应的事件. 布局代码: ...
- Eclipse常用且不易记快捷键
大小写转换:CTRL+SHIFT+X,Y 复制行:CTRL+ALT+↑,↓(部分无法使用) 查看继承关系:CTRL+T 直接查看系统源码:CTRL+SHIFT+T 查看所有快捷键:CTRL+SHIFT ...
- Linux系统中用stat命令查看文件的三个时间属性
在Linux中,没有文件创建时间的概念.只有文件的访问时间.修改时间.状态改变时间.也就是说无法知道文件的创建时间. [root@rhel7 yum.repos.d]# stat cdrom.repo ...
- samba温故知新
SAMBA服务器可以实现Windows主机和Linux主机共享资源互访的功能,即在Windows下可以通过网上邻居访问Linux操作系统中SAMBA服务器共享的文件夹,当然,Linux操作系统之间同样 ...
- Google Volley框架之https请求
先插一句.Google出的volley框架本身是支持https请求的,可是仅仅是针对有第三方机构认证过的. 假设自己随便在网上搞的一个证书,那volley是不支持请求的. 本文讲下怎样让volley支 ...
- C-C和指针作业题(第一章)
在Linux下输入EOF使用Ctrl+D, Windows下输入EOF使用Ctrl+Z 编写一个程序,从标准输入读取几行输入,每行输入都要打印到标准输出上,前面要加上行号,在编写这个程序时要试图让程序 ...
- PAT 1087 All Roads Lead to Rome
PAT 1087 All Roads Lead to Rome 题目: Indeed there are many different tourist routes from our city to ...
- 马老师 linux必备web服务入门及高级进阶
http://edu.51cto.com/course/course_id-866.html HTTP: HyperText Transfer Protocol 超文本传输协议 超链接: Web: h ...
- Google Chrome调试js代码,开发者工具之调试工具常用功能
参考:Google Chrome调试js代码-http://www.open-open.com/lib/view/open1384785324165.html 重点:左下角一个{}括号图标按钮用于把杂 ...