常见的字符串处理函数strstr,strlen,strtok

strstr

strstr ( 在一字符串中查找指定的字符串 )
    头文件:
        #include <string.h>
    定义函数:
        char *strstr(const char *haystack, const char * needle);
    参数分析:
        haystack  -->  需要查找的源字符串 ( "Hello Myoung" ) 
        needle --> 需要查找的字符串 ("Myoung") 查找到的内容
    返回值:
        成功 返回第一次出现的地址
        失败  返回0 NULL 

strlen

strlen ( 返回字符串长度 )
    头文件:
        #include <string.h>
    定义函数:
        size_t strlen (const char *s);
    参数分析:
        s --> 需要计算长度的字符串
    返回值:
        成功 返回字符串的字符数, 不包括结束字符"\0"

strtok

strtok ( 分割字符串 )
    头文件:
        #include <string.h>
    定义函数:
        char * strtok(char *s, const char *delim);
    参数分析:
        s -->  需要分割的字符串 (需要可读写的内存地址)
        delim -->  分隔符(可以有多个分隔符)
    返回值:
        返回下一个分割后的字符串指针, 
        如果已无从分割则返回 NULL.

注意:

strtok 第一次使用需要传递指针p, 如果想要从当前位置继续进行分割则指针p 必须写NULL

strchr

strchr ( 查找字符串中第一个出现的指定字符 )
strrchr   // R
    头文件:
        #include <string.h>
    定义函数:
        char * strchr (const char *s, int c);  // 从左往右找
        char * strrchr(const char *s, int c); // 从右往左找
    参数分析:
        s --> 需要遍历寻找的字符串 (只读地址即可)
        c --> 需要查找的字符 (虽然是个整型,但是实质是是一个无符号的字符类型)
    返回值:
        指定的字符则返回该字符所在地址, 
        否则返回 0.

strcpy

strcpy ( 拷贝字符串)
strncpy  【 推荐使用 】
 
    头文件:
        #include <string.h>
    定义函数:
        char *strcpy(char *dest, const char *src);   // 没有控制拷贝长度,有可能会溢出
        char * strncpy(char *dest, const char *src, size_t n); // 需要填写拷贝长度, 可以减少溢出
    参数分析:
        dest --> 拷贝字符串的目标地址 (可读写的内存)
        src --> 需要拷贝的字符串 (只读即可)
        n   -->  控制需要拷贝的长度
    返回值:
        成功 参数 dest 的字符串起始地址

strcmp

strcmp ( 比较字符串 )
    头文件:
        #include <string.h>
    定义函数:
        int strcmp(const char *s1, const char *s2);
        int strncmp(const char *s1, const char *s2, size_t n);
    参数分析:
        s1  --> 需要比较的字符串1  
        s2  --> 需要比较的字符串2
        n  --> 需要比较的前 N 个字符
    返回值:
        成功 则返回0 表示两个字符串完全相同
        失败 则返回 第一给不同字符的差值

strcat

strcat ( 连接两字符串)
    头文件:
        #include <string.h>
    定义函数:
        char *strcat(char *dest, const char *src);
        char * strncat(char *dest, const char *src, size_t n);
    参数分析:
        dest --> 目标地址, 拷贝到该字符串后面
        src  --> 源地址, 需要拷贝的内容
        n   --> 需要拷贝的字符数
    返回值:
        返回参数 dest 的字符串起始地址

sprintf

sprintf ( 格式化字符串复制 )
    头文件:
        #include <stdio.h>
    定义函数:
        int sprintf(char *str, const char * format, ...);
    参数分析:
        str --> 复制后的字符串(目标地址, 必须可读写)
        format --> 格式化控制参数(参考打印函数)
        ...  --> 可变参数
    返回值:
        成功则返回参数 str 字符串长度, 
        失败则返回-1, 错误原因存于 errno 中.

bzero

bzero ( 将一段内存内容全清为零 )
    头文件:
        #include <string.h>
    定义函数:
        void bzero(void *s, int n);
    参数分析:
        s --> 需要清空的内存的入口地址
        n --> 需要清空的字节数
    返回值:
        无

memset

memset ( 将一段内存空间填入某值 )
    头文件:
        #include <string.h>
    定义函数:
        void * memset(void *s, int c, size_t n);
    参数分析:
        s --> 需要设置的内存的入口地址 (可读写)
        c --> 需要填入的字符的ASCII值
        n --> 需要填入的字节数
    返回值:
        返回指向 s 的指针. 

注意:

该函数是按字节进行写入指定值, 因此注意应该按字节来访问。

这个函数不是很适合用来清空内存, 推荐使用bzero

memcpy

memcpy ( 拷贝内存内容)
    头文件:
        #include <string.h>
    定义函数:
        void * memcpy (void * dest, const void *src, size_t n);
        void *memccpy(void *dest, const void *src, int c, size_t n);
    参数分析:
        dest --> 目标地址 (可读写的内存地址)
        src --> 源数据地址
        c --> 
        n --> 需要拷贝的字节数
    返回值:
        返回指向 dest 的指针

示例:

    char * s1 = "Hello world" ;
    char * s2 = calloc(128 , 1 ) ; 
    memset(s2 , 'A', 128 );


    // strlen 计算的长度并不包括结束符, 因此应该+1让函数把结束符一起拷贝     
    memcpy(s2 , s1 , strlen(s1)+1);

    printf("%s\n" , s2) ;

注意:

与strcpy 不同的地方在于,strcpy在遇到结束符时停止拷贝, 而memcpy 则是会完整拷贝内存中的前N字节,不会因为遇到结束符而停止

memccpy 在复制的过程中会顺便检查是否出现了 =字符 c , 如果出现, 则停止拷贝(拷贝C之后),后面的内容就没有继续拷贝。

《拷贝到字符C为止, 最多拷贝n个字节》

memcmp

memcmp ( 比较内存内容 )
    头文件:
        #include <string.h>
    定义函数:
        int memcmp (const void *s1, const void *s2, size_t n);
    参数分析:
        s1 --> 字符串1 
        s2 --> 字符串2
        n -->  需要比较的前N字节
    返回值:
        成功 返回0 表示两个内容一致
        失败 返回之间的差值

errno

概念: 属于一个全局变量 ,不需要我们自己定义。但是需要包含一个头文件 #include <errno.h>

strerror ( 返回错误原因的描述字符串)
    头文件:
        #include <string.h>
    定义函数:
        char * strerror(int errnum);
    参数分析:
        errnum --> 错误号码
    返回值:
        返回描述错误原因的字符串指针
perror ( 打印出错误原因信息字符串 )
    头文件:
        #include <stdio.h>
    定义函数:
        void perror(const char *s);
    参数:
        s --> 用户自定义的错误提示
    返回值:
        无
for (size_t i = 0; i < 134; i++)
{
    printf("errno:%d:msg:%s\n" , i , strerror(i));  // 遍历输出所有的错误号码对应的信息
}
    
errno = 3 ; // 手动修改错误号码的值
perror("左勾拳失败"); // 根据错误号码之直接输出信息

输出结果:
errno:0:msg:Success
errno:1:msg:Operation not permitted  
errno:2:msg:No such file or directory
errno:3:msg:No such process
errno:4:msg:Interrupted system call  
errno:5:msg:Input/output error       
errno:6:msg:No such device or address
errno:7:msg:Argument list too long   
errno:8:msg:Exec format error        
errno:9:msg:Bad file descriptor
errno:10:msg:No child processes
errno:11:msg:Resource temporarily unavailable
errno:12:msg:Cannot allocate memory
errno:13:msg:Permission denied
errno:14:msg:Bad address
errno:15:msg:Block device required
errno:16:msg:Device or resource busy
errno:17:msg:File exists
errno:18:msg:Invalid cross-device link
errno:19:msg:No such device
errno:20:msg:Not a directory
errno:21:msg:Is a directory
errno:22:msg:Invalid argument
errno:23:msg:Too many open files in system
errno:24:msg:Too many open files
errno:25:msg:Inappropriate ioctl for device
errno:26:msg:Text file busy
errno:27:msg:File too large
errno:28:msg:No space left on device
errno:29:msg:Illegal seek
errno:30:msg:Read-only file system
errno:31:msg:Too many links
errno:32:msg:Broken pipe
errno:33:msg:Numerical argument out of domain
errno:34:msg:Numerical result out of range
errno:35:msg:Resource deadlock avoided
errno:36:msg:File name too long
errno:37:msg:No locks available
errno:38:msg:Function not implemented
errno:39:msg:Directory not empty
errno:40:msg:Too many levels of symbolic links
errno:41:msg:Unknown error 41
errno:42:msg:No message of desired type
errno:43:msg:Identifier removed
errno:44:msg:Channel number out of range
errno:45:msg:Level 2 not synchronized
errno:46:msg:Level 3 halted
errno:47:msg:Level 3 reset
errno:48:msg:Link number out of range
errno:49:msg:Protocol driver not attached
errno:50:msg:No CSI structure available
errno:51:msg:Level 2 halted
errno:52:msg:Invalid exchange
errno:53:msg:Invalid request descriptor
errno:54:msg:Exchange full
errno:55:msg:No anode
errno:56:msg:Invalid request code
errno:57:msg:Invalid slot
errno:58:msg:Unknown error 58
errno:59:msg:Bad font file format
errno:60:msg:Device not a stream
errno:61:msg:No data available
errno:62:msg:Timer expired
errno:63:msg:Out of streams resources
errno:64:msg:Machine is not on the network
errno:65:msg:Package not installed
errno:66:msg:Object is remote
errno:67:msg:Link has been severed
errno:68:msg:Advertise error
errno:69:msg:Srmount error
errno:70:msg:Communication error on send
errno:71:msg:Protocol error
errno:72:msg:Multihop attempted
errno:73:msg:RFS specific error
errno:74:msg:Bad message
errno:75:msg:Value too large for defined data type
errno:76:msg:Name not unique on network
errno:77:msg:File descriptor in bad state
errno:78:msg:Remote address changed
errno:79:msg:Can not access a needed shared library
errno:80:msg:Accessing a corrupted shared library
errno:81:msg:.lib section in a.out corrupted
errno:82:msg:Attempting to link in too many shared libraries
errno:83:msg:Cannot exec a shared library directly
errno:84:msg:Invalid or incomplete multibyte or wide character
errno:85:msg:Interrupted system call should be restarted
errno:86:msg:Streams pipe error
errno:87:msg:Too many users
errno:88:msg:Socket operation on non-socket
errno:89:msg:Destination address required
errno:90:msg:Message too long
errno:91:msg:Protocol wrong type for socket
errno:92:msg:Protocol not available
errno:93:msg:Protocol not supported
errno:94:msg:Socket type not supported
errno:95:msg:Operation not supported
errno:96:msg:Protocol family not supported
errno:97:msg:Address family not supported by protocol
errno:98:msg:Address already in use
errno:99:msg:Cannot assign requested address
errno:100:msg:Network is down
errno:101:msg:Network is unreachable
errno:102:msg:Network dropped connection on reset
errno:103:msg:Software caused connection abort
errno:104:msg:Connection reset by peer
errno:105:msg:No buffer space available
errno:106:msg:Transport endpoint is already connected
errno:107:msg:Transport endpoint is not connected
errno:108:msg:Cannot send after transport endpoint shutdown
errno:109:msg:Too many references: cannot splice
errno:110:msg:Connection timed out
errno:111:msg:Connection refused
errno:112:msg:Host is down
errno:113:msg:No route to host
errno:114:msg:Operation already in progress
errno:115:msg:Operation now in progress
errno:116:msg:Stale file handle
errno:117:msg:Structure needs cleaning
errno:118:msg:Not a XENIX named type file
errno:119:msg:No XENIX semaphores available
errno:120:msg:Is a named type file
errno:121:msg:Remote I/O error
errno:122:msg:Disk quota exceeded
errno:123:msg:No medium found
errno:124:msg:Wrong medium type
errno:125:msg:Operation canceled
errno:126:msg:Required key not available
errno:127:msg:Key has expired
errno:128:msg:Key has been revoked
errno:129:msg:Key was rejected by service
errno:130:msg:Owner died
errno:131:msg:State not recoverable
errno:132:msg:Operation not possible due to RF-kill
errno:133:msg:Memory page has hardware error
errno:134:msg:Unknown error 134
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Myoung_ss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值