C语言字符,字符串,字节操作常用函数

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

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

这个判断语句将永远都是真的,因为左侧的是无符号数,那个不可能比零小,所以这样做就和你的预期想法完全不同了。所以对 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 原有字符串的后面,去掉原有的 '' 将字符串添加到后面并加上一个 '' 。和上一个函数一样都需要注意的要确保目标字符数组有足够的空间,返还值也是操作后的字符串的指针。

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,"123"));
    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
",str1);
    printf("%s
",s1);
    char str2[]="123 def
asd";
    char *s2;
    s2=strtok(str2,"
");
    printf("%s
",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
",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 个字节。

原文地址:https://www.cnblogs.com/foreverW/p/7259375.html