strlen 这个函数是在 string.h 的头文件中定义的 它的函数原型是 size_t strlen( const char ); size_t 是一个无符号整型,是这样定义的 typedef unsigned int size_t;  既然它返回的不是整型数,那么如果你想直接对他的表达式进行操作,那么肯定就会存在一些问题,如下:

if( strlen(str1) - strlen(str2) >= )

这个判断语句将永远都是真的,因为左侧的是无符号数,那个不可能比零小,所以这样做就和你的预期想法完全不同了。所以对 strlen 的返还值进行强制转换为 int 类型就不用担心这种问题的出现。

strcpy 这个函数是 string.h 的头文件中定义的 它的函数原型是 char * strcpy( char *dst, char const *src); 函数的功能是把 src 字符串复制到 dst ,如果两参数在内存中出现重叠,那么结果是未定义的。因为 dst 将被修改所以他不可以是字符串常量,这个函数有一个返还值,这个返还值其实就是操作后的字符串指针的一个复制。同时在使用这个函数的时候有一个问题是必须要注意的,保证目标字符数组的空间一定要足以容纳需要复制的字符串,如果使用者不能保证这个问题,那么数组后的内存空间将被覆盖,这样引起的危害是不可估量的。

strcat 这个函数是 string.h 的头文件中定义的 它的函数原型是 char * strcat( char * dst, char const *src ); 函数的功能是把 src 字符串添加在 dst 原有字符串的后面,去掉原有的 '\0' 将字符串添加到后面并加上一个 '\0' 。和上一个函数一样都需要注意的要确保目标字符数组有足够的空间,返还值也是操作后的字符串的指针。

strcmp 这个函数是 string.h 的头文件中定义的 它的函数原型是 int strcmp (char const *s1, char const *s2 ); 函数的功能是 将两个字符串的字符逐一比较,直到发现不匹配为止,那个优先不匹配的较“小”,这种比较叫做字典比较。如果 s1 小于 s2 返回一个小于零的值,如果 s1 大于 s2 ,返回一个大于零的值,如果两个参数相等返回零。

那么既然这种函数在操作的时候需要考虑到字符数组能否存储下的问题,那个就有了相应的可以限制长度的函数。

strncpy strncat strncmp

这是三个函数的原型是

char * strncpy( char *dst, char const *src, size_t len );

char * strncat ( char *dst ,char const *src ,size_t len);

int strncmp(char const *s1, char const *s2, size_t len;

这些函数都在原来的基础上加了一个参数,就是要操作字符串的长度。strncpy 函数从 src 字符串中复制 len 个字符到 dst 中,如果不足就用NUL补充,strncat 函数从 src 中复制 len 个字符到 dst 的后面,最后并加上一个NUL。

strncmp 就是只比较 len 个字符。

strchr和strrchr 这个函数是 string.h 的头文件中定义的 它们的函数原型是

char * strchr ( char const *str, int ch);

char *strrchr ( char const *str, int ch);

strchr 功能是返回字符第一次出现在字符串中的位置,strrchr 的功能是返回最后一次出现字符串中的位置。如果不存在返回NULL指针。

strpbrk 这个函数是 string.h 的头文件中定义的 它的函数原型是 char *strpbrk( char const *str, char const *group ); 函数的功能是返回一个指向 str 中第一个匹配 group 中任何一个字符的字符位置,如果未找到返回一个NULL指针。

例:

#include<stdio.h>
#include<string.h>
int main()
{
char str[]="Hello World";
printf("%s",strpbrk(str,"aqdlze"));
}
ello World

strstr 这个函数是 string.h 的头文件中定义的 它的函数原型是 char *strstr( char const *s1,char const *s2); 这个函数在s1中查找整个s2第一次出现的位置,并返回一个指向该位置的指针,如果s2没有完全的出现在s1的任何位置就返回一个NULL指针,如果s2是一个空字符串就返回s1。

strspn 和 strcspn 这两个函数的原型是:

size_t strspn ( char const *str, char const * group );

size_t strcspn ( char const *str, char const * group );

group 指定一个或多个字符,strspn 返回 str 起始部分匹配 group 中任意字符的字符数。

例如:

#include<stdio.h>
#include<string.h>
int main()
{
char *str="bcda adb,123";
printf("%d ",strspn(str,"abcd123"));
printf("%d ",strspn(str,"abcd123 "));
printf("%d ",strspn(str,"abcd123 ,"));
}
4 8 12

strcspn 的功能正好和 strspn 相反

#include<stdio.h>
#include<string.h>
int main()
{
char *str="bcda adb,123";
printf("%d ",strcspn(str,""));
printf("%d ",strcspn(str,","));
printf("%d ",strcspn(str,"123 ,"));
}
9 8 4

strtok 这个函数是 string.h 的头文件中定义的 它的函数原型是 char * strtok(char *str, const char *sep); sep是分隔字符串集合,str 中包含了零个或多个sep中的一个或多个分隔标记,strtok 的功能就是找出 str 中的下一个标记,并将其用NUL结尾,返回指向这个标记的指针。需要注意的是 str 参数不是只读的,在函数中它将会被改变,所以如果传入的参数是不可以改变的,那个就应该提前对这个字符串进行复制,然后再传入函数中。

#include<stdio.h>
#include<string.h>
int main()
{
char str1[]="abc,def ghi,jkl";
char *s1;
s1=strtok(str1," ,");
printf("%s\n",str1);
printf("%s\n",s1);
char str2[]="123 def\nasd";
char *s2;
s2=strtok(str2,"\n");
printf("%s\n",str2);
printf("%s",s2);
}
abc
abc
123 def
123 def

那么这样就会出现一个问题,因为加了一个NUL所以字符串只后面的部分访问不到了,我想这和你最初的想法肯定背道而驰了,那么应该如何解决这个问题那?

请看下面一段代码:

#include<stdio.h>
#include<string.h> void print_tok(char *line,char const *sign)
{
char *tok;
for( tok = strtok(line, sign); tok != NULL; tok = strtok(NULL, sign) )
{
printf("%s\n",tok);
}
} int main()
{
char str[]="asd zxc qwe";
print_tok(str," ");
}
asd
zxc
qwe

为什么会这样,因为如果 strtok 的第一个参数是NULL函数就在同一个字符串中从保存的位置开始像前面一样查找下一个标记,如果字符串中不存在更多的标记,就返回一个NULL指针。strtok 函数会保存它的处理状态的局部信息,所以在处理完一个字符串前不可以处理另一个字符串。

strerror 这个函数是 string.h 的头文件中定义的 它的函数原型是 char *strerror( int error_number ); 这个函数的参数是一个外部整型变量 errno ,在你调用函数出现错误的时候就会通过 errno 这个变量作为 strerror 的参数,并返回一个指向描述错误的字符串的指针。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
FILE *fp;
fopen("aaa","r");
printf("%s",strerror(errno));
}
No such file or directory

字符分类函数:

每个分类函数接收一个包含字符的整型参数,函数测试这个字符并返回一个整型值,表示真或假(ANSI C标准并没有指定任何特定值,所以可能返回任何非零值,所以不要和1进行比较,不然可能出现不可预料的结果)。

分类函数如下表:

                                          引用自《C和指针》

字符转换函数:

int tolower( int ch ); 返回参数转换成对应的小写字母。

int toupper( int ch ); 返回参数转换成对应的大写字母。

如果传入的参数不需要进行操作或无法进行操作,不进行修改参数直接返回。

内存操作(字节操作)函数:

char *memcpy( void *dst, void const *src, size_t length );

char *memmove( void *dst, void const *src, size_t length );

char *memcmp( void const *a,void const *b, size_t length);

char *memchr( void const *a, int ch, size_t length );

char *memset( void *a ,int ch, size_t length );

字符串函数在处理字符串的时候,遇到NUL就会停止,但是非字符串中有很多包含NUL的情况,那个就用到了上面的函数了。memcpy 实现的就是将 src 的数据 length 个复制到 dst 中,同时如果是整型或浮点数组,那么也不用进行强制转换,因为函数的参数是void的类型指针,所有类型的指针都可以接收,和 strcpy 相同的如果两个参数在内存中有重叠的部分,那么结果是未定义的。

但是 memmove 就解决了这个问题,它实现的功能和 memcpy 是相似的,但是它是先将第二个参数要复制的内容复制到另外的一个变量中,然后再复制给第一个参数。

memcmp 和 strcmp 比较方式相同,但是如果比较的内容不是字母范围内的东西,那么结果是不可预料的。

memchr 就是在第一参数中查找第一个 包含字符的参数 ch 的位置,并返回它的指针。

memset 的功能是将 ch 字符从第一个参数的开始进行填充,填充 length 个字节。

C语言字符,字符串,字节操作常用函数的更多相关文章

  1. go语言之进阶篇字符串操作常用函数介绍

    下面这些函数来自于strings包,这里介绍一些我平常经常用到的函数,更详细的请参考官方的文档. 一.字符串操作常用函数介绍 1.Contains func Contains(s, substr st ...

  2. 1. python 字符串简介与常用函数

    1. python中的字符串简介与常用函数 在python中,字符串变成了一个强大的处理工具集,他是不可变的,也就是说字符串包含字符与字符的顺序,他不可以原处修改 字符串是我们后面需要学习的稍大一点的 ...

  3. php中文件操作常用函数有哪些

    php中文件操作常用函数有哪些 一.总结 一句话总结:读写文件函数 判断文件或者目录是否存在函数 创建目录函数 file_exists() mkdir() file_get_content() fil ...

  4. PHP字符串操作常用函数

    /* * 确定字符串长度 * int strlen(string str) * 比较两个字符串 * 1.strcmp函数对两个字符串进行二进制安全的比较,并区分大小写 * int strcmp(str ...

  5. dplyr 数据操作 常用函数(5)

    继续来了解dplyr中的其他有用函数 1.sample() 目的是可以从一个数据框中,随机抽取一些行,然后组成新的数据框. sample_n(tbl, size, replace = FALSE, w ...

  6. dplyr 数据操作 常用函数(4)

    接下来我们继续了解一些dplyr中的常用函数. 1.ranking 以下各个函数可以实现对数据进行不同的排序 row_number(x) ntile(x, n) min_rank(x) dense_r ...

  7. dplyr 数据操作 常用函数(2)

    继上一节常用函数,继续了解其他函数 1.desc() 这个函数和SQL中的排序用法是一样的,表示对数据进行倒序排序. 接下来我们看些例子. a=sample(20,50,rep=T)a desc(a) ...

  8. c语言中字符串转数字的函数

    ANSI C 规范定义了 atof().atoi().atol().strtod().strtol().strtoul() 共6个可以将字符串转换为数字的函数,大家可以对比学习.另外在 C99 / C ...

  9. C语言中关于字符串的一些常用函数

    使用以下时应当在头文件中加入string.h getch()为当你键入任何一个值时,返回但是并不显示,立马编译结束,返回的是asc码  getchar():当你键入回车之后才算是输入结束,并且可以用p ...

随机推荐

  1. Hibernate的优化方案

    使用参数绑定 使用绑定参数的原因是让数据库一次解析SQL,对后续的重复请求可以使用生成好的执行计划,这样做节省CPU时间和内存. 避免SQL注入. 尽量少使用NOT 如果where子句中包含not关键 ...

  2. Linux表面工作

    https://www.cnblogs.com/welhzh/p/5899875.html 1.显示文本文件的内容 /etc/issue   #登录前提示 /etc/motd   #登录后提示 ssh ...

  3. screen命令常用参数使用

    screen简要说明 screen 会话命令可以保持本地和服务器断开后,程序继续在服务器上运行,并且运行结束后,输出最后的结果.功能结果相当于 nohup command &,但是功能远比no ...

  4. servlet获取并存储web.xml中context-param参数

    在web.xml中定义了context-param,一般不会随意改动,所以在监听器中做一次处理,容器启动时读取并存储在Properties中,方便以后取值. SysProperties 类用于存储 c ...

  5. CodeForces - 95B

    Petya loves lucky numbers. Everybody knows that positive integers are lucky if their decimal represe ...

  6. 【hihocoder】1237 : Farthest Point 微软2016校招在线笔试题

    题目:给定一个圆,要你求出一个在里面或者在边上的整数点,使得这个点到原点的距离最大,如果有多个相同,输出x最大,再输出y最大. 思路:对于一个圆,里面整点个数的x是能确定的.你找到x的上下界就可以了. ...

  7. EasyTouch3.16 初步使用

  8. phpcms Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE错误

    我在phpcms的模板中自定义了一个变量,变量的值是通过pc标签赋予的. <?php $url="{$v[url]}"; ?> 结果报如上错误. 实际上应把PHP语句改 ...

  9. Arduino连接SHT10温湿度传感器--返回值不正常解决办法

    如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Ar ...

  10. 用简单的方法学习ES6

    ES6 简要概览 这里是ES6 简要概览.本文大量参考了ES6特性代码仓库,请允许我感谢其作者@Luke Hoban的卓越贡献,也感谢@Axel Rauschmayer所作的[优秀书籍]//explo ...