strlen

size_ t strlen ( const char * str );

字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0' )
参数指向的字符串必须要以'\0'结束,char arr[]={'a','b','c','d'};这种数组不行,这种数组最后没有'\0',int len=strlen(arr);得到的是随机值。注意函数的返回值为size_ t,size_t 就是unsigned int

strcpy

char* strcpy(char * destination,const char * source );

源字符串必须以'\0'结束。拷贝的位置是从目标地址的第一个元素开始会将源字符串中的'\0'拷贝到目标空间
目标空间必须足够大,以确保能存放源字符串。目标空间必须可变,不能是const

strncpy

char *strncpy( char *strDest, const char *strSource, size_ t count );

第三个参数是要拷贝的字符个数,当源字符串不足时,补'\0',但是要注意count是几就拷贝几个,不会在拷贝完后追加'\0'

char arr1[30]="abcdxxxxxxxxxxx",arr2[]="ef";
strncpy(arr1,arr2,6);//arr2不足6位,拷贝的时候在arr1补0,arr2还是ef,后面也只有一个'\0'

图片说明

strcat

char * strcat ( char * destination, const char * source );

源字符串必须以'\0'结束。目标空间必须有足够的大,能容纳下源字符串的内容。目标空间必须可修改。字符串自己不能给自己追加
源字符串的'\0'也追加到目标空间了,并且是从目标空间的'\0'开始,'\0'要被覆盖掉

strncat

char *strncat( char *strDest, const char *strSource, size_ t count );

count为追加个数,追加完后会在后面补'\0',当源字符串个数小于count时,多余的部分不追加

char arr1[30]="abcdefxxx\0xxxxxxxxx",arr2[]="jk";
strncat(arr1,arr2,8);

图片说明

strcmp

int strcmp( const char *stringl, const char *string2 );

比的是字符的ascall码的大小,两个字符串第一个字符相等就比较第二个,以此类推
string1小于string2返回值<0,string1等于string2返回值=0,string1大于string2返回值>0,

strncmp

int strncmp ( const char * str1,const char * str2,size. _t mum );

基本都和strcmp一样,只是mum是比较的字符个数

strstr

char *strstr (const char *,const char *);

查找字符串函数,找到了返回查找字符串在目标中的首地址,没找到返回NULL指针

strtok

char * strtok ( char * str,const char * sep ) ;

char str[]="10086@qq.com";
char sep[]="@.";
char *p;
p=strtok(str,sep);printf("%s",p);//10086
p=strtok(NULL,sep);printf("%s",p);//qq
p=strtok(NULL,sep);printf("%s",p);//com

图片说明
sep参数是个字符串,定义了用作分隔符的字符集合,例如上例的'@'和'.',也叫标记
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
strtok函数找到str中的一个标记时,将其用\0替换,返回一个指向这个标记的指针。
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串时,一般都要用临时拷贝的内容进行切分。
strtok函数在找str中第一个标记时,第一个参数设置为str的首元素地址,在找到第一个标记时,strtok函数将保存它在字符串中的位置。
strtok函数在找str中除第一个标记以外的标记时,第一个参数设为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回NULL指针。

strerror

char*strerror ( int errnum ) ;

返回错误码,所对应的错误信息。errno是一个全局的错误码的变量,
当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errno中

    FILE* pf = fopen("test .txt", "r");//打开文件
    if (pf == NULL)
    {
        printf("%s\n", strerror(errno));
    }
    else
        printf("open file success\n");

图片说明


字符分类函数

图片说明
还有两个字符转换函数:
int tolower ( int c );//将大写转换为小写
int toupper ( int c );//将小写转换为大写

char arr[]="abcdefjk"
int i = 0;
    while (arr[i])
    {
        if (islower(arr[i]))//是否小写
            arr[i] = toupper(arr[i]);//转化为大写
            i++;
    }
        printf("%s\n", arr); 

图片说明 通过循环就可以实现字符串大小写的转换

相关代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <errno.h>
int my_strlen(const char a[])
{
    int count=0;
    while (*a)
    {
        count++;
        a++;
    }
    return count;
}
char* my_strcpy(char* aim, const char* str)
{
    char *a = aim;
    while (*aim++ = *str++);
    return a;
}
char* my_strcat(char* aim, const char* str)
{
    char *a = aim;
    while (*aim)aim++;
    while (*aim++ = *str++);
    return a;
}
int my_strcmp(const char* str1, const char* str2)
{
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
        {
            return 0;
        }
        str1++;
        str2++;
    }
    return (*str1 - *str2);

}
char* my_strncpy(char* aim,const char* str,int count)
{
    char* a = aim;
    while (count && (*aim++ = *str++))
        count--;
    if (count)
        while (--count)
            *aim++ = '\0';
    return a;
}
char * my_strncat(char * aim,const char * str,int count)
{
    char *a = aim;
    while (*aim++)
        aim--;
    while (count--)
        if (!(*aim++ = *str++))
            return(a);
    *aim = '\0';
    return a;
}

int main()
{
    char arr1[30] = "abcdef",arr[30]="abcdef";//两个数组,在不同空间,只是内容一样
    char *p = "abcd";//这是常量字符串
    char *q = "abcd";//p,q指向的是同一块空间,与数组不同
    char arr2[] = { 'a','b','c','e','f' };
    char arr3[] = { "jk" };
    int a =strlen(arr1); 
    int b = strlen(arr2);
    char *p1 = "ab", *p2 = "cd";
    char *res; 
    char str[] = "10086@qq.com";
    char sep[] = "@.";
    printf("%d\n", a);//6
    printf("%d\n", b);//随机值
    if (strlen("abcd") - strlen("abcdef")>0)//这里需要注意,strlen返回值是无符号整型,
        //4-6=-2,-2=10000010,10000010无符号是130
        printf("1\n");//所以打印1
    else
        printf("2\n");
    //arr1 = arr3;这种直接将地址赋值给地址的拷贝方式是错误的,字符串之间的拷贝用strcpy函数
    //strcpy(arr1, arr2);arr2没有\0,会向后越界访问
    //strcpy(p, arr3);p是常量字符串,不能修改

    strcpy(arr1, arr3);
    printf("%s\n", arr1);//jk,这里没有cdef,因为将arr3的\0也拷贝了
    strncpy(arr1, p1, 6);//不足6位补0
    printf("%s\n", arr1);//ab,
    strcat(arr, arr3);
    printf("%s\n", arr);//abcdefjk,这里也可以证明arr和arr1在不同空间,如是在同一块空间应是打印jkjk
    strncat(arr1, arr3,8);//在追加完后,会在后面补0,arr3不足8个,超过的部分不追加
    printf("%s\n", arr);//abcdefjkjk
    printf("%d  %d  %d\n",strcmp(p, q), strcmp(p1, p2), strcmp(p2, p1));
    res=strstr(p, p1);//查找字符串函数,找到了返回查找字符串在p中的首地址,没找到返回NULL指针
    if (res == NULL)printf("没找到");
    else printf("%s\n", res);//abcd
    for(res=strtok(str, sep);res!=NULL; res = strtok(NULL, sep))
        printf("%s\n", res);

//errno是一个全局的错误码的变量
//当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errno中
    FILE* pf = fopen("test .txt", "r");//打开文件
    if (pf == NULL)
    {
        printf("%s\n", strerror(errno));
    }
    else
        printf("open file success\n");
    int i = 0;
    while (arr[i])
    {
        if (islower(arr[i]))
            arr[i] = toupper(arr[i]);
            i++;
    }
        printf("%s\n", arr); 

    return 0;
}

图片说明