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. PAT天梯赛L3-005 垃圾箱分布

    题目链接:点击打开链接 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住.所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的 ...

  2. php保存网络图片到本地

    //保存网络图片 function getimg($url) { $state = @file_get_contents($url,0,null,0,1);//获取网络资源的字符内容 if($stat ...

  3. Jmeter3.2源码编译环境搭建(转)

    1.下载jmeter3.2源码 https://github.com/apache/jmeter/tree/v3_2 https://blog.csdn.net/fly_to_higher/artic ...

  4. POJ3974 Palindrome Manacher 最长回文子串模板

    这道题可以$O(nlogn)$,当然也可以$O(n)$做啦$qwq$ $O(nlogn)$的思路是枚举每个回文中心,通过哈希预处理出前缀和后缀哈希值备用,然后二分回文串的长度,具体的就是判断在长度范围 ...

  5. 2017 ACM/ICPC Asia Regional Shenyang Online number number number

    题意:求n个斐波那契数列组合都无法得到的最小数字 解法: 1 我们先暴力的求出前面几个数字 2 然后再暴力的求递推 3 接着矩阵快速幂(没写错吧?) /*#include<bits/stdc++ ...

  6. Linux--6 redis订阅发布、持久化、集群cluster、nginx入门

    一.redis发布订阅 Redis 通过 PUBLISH .SUBSCRIBE 等命令实现了订阅与发布模式. 其实从Pub/Sub的机制来看,它更像是一个广播系统,多个Subscriber可以订阅多个 ...

  7. Java多线程与并发——死锁与中断线程

    过多的同步有可能出现死锁,死锁的操作一般是在程序运行的时候才有可能出现. 多线程中要进行资源的共享,就需要同步,但同步过多,就可能造成死锁. 死锁例子: package com.vince; /** ...

  8. 关于js框架 dwz 与 yii的的分页 以及筛选的结合

    此为jicheng1014 原创....地址为http://jicheng1014.cnblogs.com dwz是一个不错的前端框架  但是 注意   所有的后端   都是要自己写的 常见的应用是 ...

  9. JQury各种ajax函数

    $.get(url,[data],[callback],[type]) 说明:以get方式发送请求,url为请求地址,data为请求数据的列表,callback为请求成功后的回调函数,该函数接受两个参 ...

  10. 寻找jar包的方法

    在项目开发中经常会遇到资源jar查找难的问题,一种使用maven ,另一种方法是: (1).使用下载地址:https://oss.sonatype.org/content/repositories/r ...