C语言字符,字符串,字节操作常用函数
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语言字符,字符串,字节操作常用函数的更多相关文章
- go语言之进阶篇字符串操作常用函数介绍
下面这些函数来自于strings包,这里介绍一些我平常经常用到的函数,更详细的请参考官方的文档. 一.字符串操作常用函数介绍 1.Contains func Contains(s, substr st ...
- 1. python 字符串简介与常用函数
1. python中的字符串简介与常用函数 在python中,字符串变成了一个强大的处理工具集,他是不可变的,也就是说字符串包含字符与字符的顺序,他不可以原处修改 字符串是我们后面需要学习的稍大一点的 ...
- php中文件操作常用函数有哪些
php中文件操作常用函数有哪些 一.总结 一句话总结:读写文件函数 判断文件或者目录是否存在函数 创建目录函数 file_exists() mkdir() file_get_content() fil ...
- PHP字符串操作常用函数
/* * 确定字符串长度 * int strlen(string str) * 比较两个字符串 * 1.strcmp函数对两个字符串进行二进制安全的比较,并区分大小写 * int strcmp(str ...
- dplyr 数据操作 常用函数(5)
继续来了解dplyr中的其他有用函数 1.sample() 目的是可以从一个数据框中,随机抽取一些行,然后组成新的数据框. sample_n(tbl, size, replace = FALSE, w ...
- dplyr 数据操作 常用函数(4)
接下来我们继续了解一些dplyr中的常用函数. 1.ranking 以下各个函数可以实现对数据进行不同的排序 row_number(x) ntile(x, n) min_rank(x) dense_r ...
- dplyr 数据操作 常用函数(2)
继上一节常用函数,继续了解其他函数 1.desc() 这个函数和SQL中的排序用法是一样的,表示对数据进行倒序排序. 接下来我们看些例子. a=sample(20,50,rep=T)a desc(a) ...
- c语言中字符串转数字的函数
ANSI C 规范定义了 atof().atoi().atol().strtod().strtol().strtoul() 共6个可以将字符串转换为数字的函数,大家可以对比学习.另外在 C99 / C ...
- C语言中关于字符串的一些常用函数
使用以下时应当在头文件中加入string.h getch()为当你键入任何一个值时,返回但是并不显示,立马编译结束,返回的是asc码 getchar():当你键入回车之后才算是输入结束,并且可以用p ...
随机推荐
- LaTeX使用心得
LaTeX是一个功能强大的,开源的排版工具. 最近教练让我们做课件,我做数论,鉴于LaTeX的数学公式功能强大(而MS办公软件的数学公式简直就是个LJ)和我的学习精神,我决定用LaTeX写课件. 在一 ...
- 【常见Web应用安全问题】
Web应用程序的安全性问题依其存在的形势划分,种类繁多,这里不准备介绍所有的,只介绍常见的一些. 常见Web应用安全问题安全性问题的列表: 1.跨站脚本攻击(CSS or XSS, Cross Sit ...
- 解决运行Robot Framework报‘’ascii’错误
在Python27\Lib\site-packages中新建‘sitecustomize.py’,内容如下: #coding=utf8import sysreload(sys)sys.setdefau ...
- java poi操作创建xslx或xsl文件,存本地和进行网络传输两种方式集成
package com.java.zxf.util; import java.io.IOException; import java.io.OutputStream; import java.net. ...
- 安装php过程中的错误和解决方式 configure: error: jpeglib.h not found
centos6.5 32位系统: checking for the location of libpng... yeschecking for the location of libXpm... no ...
- 敏捷开发(Agile development)
敏捷开发(Agile development) 敏捷开发是一种以人为核心.迭代.循序渐进的开发方法.在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征. ...
- SpringBoot | 第二章:lombok介绍及简单使用
在去北京培训的时候,讲师说到了lombok这个第三方插件包,使用了之后发现,确实是个神奇,避免了编写很多臃肿的且定式的代码,虽然现代的IDE都能通过快捷键或者右键的方式,使用Generate Gett ...
- Elasticsearch在后台启动
Elasticsearch在linux下使用命令sh elasticsearch start,按键ctrl+c的时候程序就会stop掉,如何将程序在后台启动呢? 需要使用:./elasticsearc ...
- ElasticSearch入门-搜索(java api)
ElasticSearch入门-搜索(java api) package com.qlyd.searchhelper; import java.util.Map; import net.sf.json ...
- aspx有"记住我"的登录
客户端 <form id="form1" runat="server"> <div> 用户名:<input type=" ...