首页 > 其他分享 >15-字符串处理的常用函数——查找字符串,求字符串长度,分割字符串,查找指定字符,比较字符串,连接字符串

15-字符串处理的常用函数——查找字符串,求字符串长度,分割字符串,查找指定字符,比较字符串,连接字符串

时间:2024-06-15 18:57:19浏览次数:21  
标签:15 示例 errno char msg 查找 字符串 include

15-字符串处理的常用函数——查找字符串,求字符串长度,分割字符串,查找指定字符,比较字符串,连接字符串

文章目录

1. strstr

strstr 函数用于在一个字符串中查找指定的子字符串。

头文件:

#include <string.h>

定义函数:

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

参数分析:

  • haystack:需要查找的源字符串。
  • needle:需要查找的子字符串。

返回值:

  • 成功:返回第一次出现的地址。
  • 失败:返回 NULL。

1.1 示例代码

#include <stdio.h>
#include <string.h>

int main() {
    const char *haystack = "Hello Even";//常目标指针-->目标不可变
    const char *needle = "Even";
    char *result = strstr(haystack, needle);

    if (result) {
        printf("Found '%s' in '%s' at position: %ld\n", needle, haystack, result - haystack);
    } else {
        printf("'%s' not found in '%s'\n", needle, haystack);
    }

    return 0;
}

2. strlen

strlen 函数用于返回字符串的长度

头文件:

#include <string.h>

定义函数:

size_t strlen(const char *s);

参数分析:

  • s:需要计算长度的字符串。

返回值:

  • 返回字符串的字符数,不包括结束字符 '\0'

2.1 示例代码

#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Hello, World!";
    size_t length = strlen(str);

    printf("The length of the string '%s' is: %zu\n", str, length);

    return 0;
}

3. strtok

strtok 函数用于分割字符串

函数说明strtok()用来将字符串分割成一个个片段,参数s指向欲分割的字符串,参数delim则为分割字符串;

  • 当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为==“\0”==字符;
  • 在第一次调用时strtok()必需给予参数 s 字符串,往后的调用则将参数 s 设置成NULL.每次调用成功则返回下一个分割后的字符串指针。

头文件:

#include <string.h>

定义函数:

char *strtok(char *s, const char *delim);

参数分析:

  • s:需要分割的字符串(需要可读写的内存地址)。
  • delim:分隔符(可以有多个分隔符)。

返回值:

  • 返回下一个分割后的字符串指针,如果已无从分割则返回 NULL。

注意事项

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

3.1 示例代码

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World! This is a test.";
    const char *delim = " ,.!";

    char *token = strtok(str, delim);
    while (token != NULL) {
        printf("Token: %s\n", token);
        token = strtok(NULL, delim);
    }

    return 0;
}

4. strchrstrrchr

用于查找字符串中第一个出现最后一个指定字符

头文件

#include <string.h>

定义函数

char *strchr(const char *s, int c);  // 从左往右找
char *strrchr(const char *s, int c); // 从右往左找

参数分析

  • s:需要遍历寻找的字符串(只读地址即可)。
  • c:需要查找的字符(虽然是个整型,但实质是一个无符号的字符类型)。

返回值

  • 成功:返回该字符所在的地址。
  • 失败:返回 NULL。

4.1 示例代码

#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Hello, World!";
    char ch = 'o';

    char *first_occurrence = strchr(str, ch);
    char *last_occurrence = strrchr(str, ch);

    if (first_occurrence) {
        printf("First occurrence of '%c': %ld\n", ch, first_occurrence - str);
    } else {
        printf("Character '%c' not found\n", ch);
    }

    if (last_occurrence) {
        printf("Last occurrence of '%c': %ld\n", ch, last_occurrence - str);
    } else {
        printf("Character '%c' not found\n", ch);
    }

    return 0;
}

5. strcpystrncpy

用于拷贝字符串

头文件

#include <string.h>

定义函数

char *strcpy(char *dest, const char *src);  // 没有控制拷贝长度,有可能会溢出
char *strncpy(char *dest, const char *src, size_t n);  // 需要填写拷贝长度,减少溢出

参数分析

  • dest:拷贝字符串的目标地址(可读写的内存)。
  • src:需要拷贝的字符串(只读即可)。
  • n:控制需要拷贝的长度。

返回值

  • 成功:返回参数 dest 的字符串起始地址。

5.2 示例代码

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, World!";
    char dest[50];

    strcpy(dest, src);
    printf("strcpy: %s\n", dest);

    strncpy(dest, "Goodbye", 4);
    dest[4] = '\0';  // 需要手动添加结束符
    printf("strncpy: %s\n", dest);

    return 0;
}

6.strcmpstrncmp

用于比较字符串。

函数说明strcmp()用来比较参数s1和s2字符串,字符串大小的比较是以Asc11码表上的顺序来决定,此顺序亦为字符的值.

strcmp()首先将s1第一个字符值减去s2第一个字符值,若差值为。则再继续比较下个字符,若差值不为0则将差值返回.例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和"b"(98)的差值(-33).

头文件

#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,表示两个字符串完全相同。
  • 失败:返回第一个不同字符的差值。

6.1 示例代码

#include <stdio.h>
#include <string.h>

int main() {
    const char *str1 = "Hello";
    const char *str2 = "Hello, World!";

    int result = strcmp(str1, str2);
    printf("strcmp: %d\n", result);

    result = strncmp(str1, str2, 5);
    printf("strncmp: %d\n", result);

    return 0;
}

7.strcatstrncat

用于连接两个字符串

头文件

#include <string.h>

定义函数

char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);

参数分析

  • dest:目标地址,拷贝到该字符串后面。
  • src:源地址,需要拷贝的内容。
  • n:需要拷贝的字符数。

返回值

  • 返回参数 dest 的字符串起始地址。

7.1 示例代码

#include <stdio.h>
#include <string.h>

int main() {
    char dest[50] = "Hello";
    const char *src = ", World!";

    strcat(dest, src);
    printf("strcat: %s\n", dest);

    strncat(dest, " Goodbye", 5);
    printf("strncat: %s\n", dest);

    return 0;
}

8. sprintf

用于格式化字符串复制。

头文件

#include <stdio.h>

定义函数

int sprintf(char *str, const char *format, ...);

参数分析

  • str:复制后的字符串(目标地址,必须可读写)。
  • format:格式化控制参数(参考打印函数)。
  • ...:可变参数。

返回值

  • 成功:返回参数 str 字符串长度。
  • 失败:返回 -1,错误原因存于 errno 中。

8.1 示例代码

#include <stdio.h>

int main() {
    char buffer[50];
    int x = 42;
    double y = 3.14;

    sprintf(buffer, "x = %d, y = %.2f", x, y);
    printf("sprintf: %s\n", buffer);

    return 0;
}

9. bzero

用于将一段内存内容全清为零

头文件

#include <string.h>

定义函数

void bzero(void *s, int n);

参数分析

  • s:需要清空的内存的入口地址。
  • n:需要清空的字节数。

返回值

  • 无。

9.1 示例代码

#include <stdio.h>
#include <strings.h>

int main() {
    char buffer[50];
    strcpy(buffer, "Hello, World!");
    printf("Before bzero: %s\n", buffer);

    bzero(buffer, sizeof(buffer));
    printf("After bzero: %s\n", buffer);

    return 0;
}

10.memset

用于将一段内存空间填入某值。

头文件

#include <string.h>

定义函数

void *memset(void *s, int c, size_t n);

参数分析

  • s:需要设置的内存的入口地址(可读写)。
  • c:需要填入的字符的 ASCII 值。
  • n:需要填入的字节数。

返回值

  • 返回指向 s 的指针。

10.1 示例代码

#include <stdio.h>
#include <string.h>

int main() {
    char buffer[50];
    memset(buffer, 'A', sizeof(buffer));
    buffer[49] = '\0';  // 确保最后一个字符是结束符

    printf("memset: %s\n", buffer);

    return 0;
}

11.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);

注意:

  • 与strcpy 不同的地方在于,strcpy在遇到结束符时停止拷贝, 而memcpy 则是会完整拷贝内存中的前N字节,不会因为遇到结束符而停止
  • memccpy 在复制的过程中会顺便检查是否出现了 字符 c , 如果出现, 则停止拷贝(拷贝C之后),后面的内容就没有继续拷贝。
    《拷贝到字符C为止, 最多拷贝n个字节》

参数分析

  • dest:目标地址(可读写的内存地址)。
  • src:源数据地址。
  • c:在 memccpy 中,用于检测的字符。
  • n:需要拷贝的字节数。

返回值

  • 返回指向 dest 的指针。

11.1 示例代码

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, World!";
    char dest[50];

    memcpy(dest, src, strlen(src) + 1);
    printf("memcpy: %s\n", dest);

    memccpy(dest, " Goodbye", 'd', 8);
    printf("memccpy: %s\n", dest);

    return 0;
}

12. memcmp

用于比较内存内容。

头文件

#include <string.h>

定义函数

int memcmp(const void *s1, const void *s2, size_t n);

参数分析

  • s1:内存块1。
  • s2:内存块2。
  • n:需要比较的前 N 字节。

返回值

  • 成功:返回0,表示两个内存块内容一致。
  • 失败:返回两个内存块内容的差值。

12.1 示例代码

#include <

stdio.h>
#include <string.h>

int main() {
    char buffer1[] = "Hello, World!";
    char buffer2[] = "Hello, World!";
    char buffer3[] = "Hello, world!";

    int result = memcmp(buffer1, buffer2, strlen(buffer1));
    printf("memcmp (buffer1, buffer2): %d\n", result);

    result = memcmp(buffer1, buffer3, strlen(buffer1));
    printf("memcmp (buffer1, buffer3): %d\n", result);

    return 0;
}

13.错误号 (errno) 和错误信息处理

13.1 概念

errno 是一个全局变量,用于表示最近一次系统调用或库函数调用错误的错误码。它不需要我们自己定义,只需要包含头文件即可。

头文件:

#include <errno.h>

13.2 strerror 函数

该函数用于返回对应错误号的描述字符串

头文件:

#include <string.h>

定义函数:

char *strerror(int errnum);

参数分析:

  • errnum:错误号码。

返回值:

  • 返回描述错误原因的字符串指针。
示例代码
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
    for (size_t i = 0; i < 134; i++) {
        printf("errno:%zu:msg:%s\n", i, strerror(i));
    }
    
    errno = 3; // 手动修改错误号码的值
    perror("左勾拳失败"); // 根据错误号码之直接输出信息

    return 0;
}

13.3 perror 函数

该函数用于打印出错误原因信息字符串

头文件:

#include <stdio.h>

定义函数:

void perror(const char *s);

参数分析:

  • s:用户自定义的错误提示。

返回值:

  • 无返回值。
示例
#include <stdio.h>
#include <errno.h>

int main() {
    // 触发一个错误
    FILE *file = fopen("nonexistent.txt", "r");
    if (!file) {
        perror("文件打开失败");
    }

    // 手动设置错误号码
    errno = 3;
    perror("左勾拳失败");

    return 0;
}

13.4 错误号码及其对应的描述信息

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

标签:15,示例,errno,char,msg,查找,字符串,include
From: https://blog.csdn.net/qq_63831368/article/details/139586337

相关文章

  • Python武器库 - 科研中常用的python字符串处理 - 字符串扩充
    在python科研编程中,字符串扩充通常在处理文件名、数据集列表、或打印模型训练过程信息时非常实用,尤其是打印模型训练过程信息时,通常需要在每一轮之间打印一行符号表示分隔,此时字符串扩充的功能尤其好用,它能够省去手动输入字符的时间,使得输出字符串更加工整。1.str.center(widt......
  • 算法训练(leetcode)第九天 | 232. 用栈实现队列、225. 用队列实现栈、20. 有效的括号、1
    刷题记录232.用栈实现队列225.用队列实现栈20.有效的括号1047.删除字符串中的所有相邻重复项232.用栈实现队列leetcode题目地址考察栈与队列之间的特性。栈:后进先出(先进后出)——FILO。队列:先进先出——FIFO。所以使用两个栈模拟队列,分别为in和out。当入队新......
  • 【2024.06.15】35mm定焦构图练习
    图源都为午饭饭,可以在B站搜索到,侵删50期日光充足、裙、小清新、城镇、伞......
  • 2024-06-15:用go语言,Alice 和 Bob 在一个环形草地上玩一个回合制游戏。 草地上分布着一
    2024-06-15:用go语言,Alice和Bob在一个环形草地上玩一个回合制游戏。草地上分布着一些鲜花,其中Alice到Bob之间顺时针方向有x朵鲜花,逆时针方向有y朵鲜花。游戏规则如下:1.游戏从Alice开始。2.每个回合中,当前玩家必须选择顺时针或逆时针,并在所选方向上摘取一朵鲜花。......
  • 6.15 七桥问题,欧拉回路
    欧拉回路就是,用一条线,走过所有的路,而且不重复,这种问题使用了并查集并查集分为两个部分:查找:1.初始化,将每个节点都初始化成一颗树find():根据给的边,找到他们的根节点,并更新union():把根节点不一样的连成一颗树,实现几棵树变成一棵树并查集的作用:在于判断所有的节点是不是属于同一个......
  • Studying-代码随想录训练营day9| 151.反转字符串里的单词、卡码网:55.右旋转字符串、28
    第九天,......
  • 支付宝签名和验签使用JSONObject是最优解。json字符串顺序和==符号都一致演示代码
    支付宝签名和验签使用JSONObject是最优解。json字符串顺序和==符号都一致演示代码支付宝spi接口设计验签和返回结果加签注意点,支付宝使用JSONObject对象https://www.cnblogs.com/oktokeep/p/18249346packagecom.example.core.mydemo;importcom.alibaba.fastjson.JSON;imp......
  • 初识C语言~~查找票数最高候选人
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、题目描述二、解题思路三、编写代码总结前言提示:这里可以添加本文要记录的大概内容:大家好又见面喽!!今天是刷题,二话不说开干。提示:以下是本篇文章正文内容,下面案例可供参考一、题目......
  • 闲话 24.6.15
    闲话待补。也可能不补(最近听了好多v曲啊(感叹今日推歌:乌云雨透明的我by沉林川etal.feat.星尘:去时枝by沉林川feat.洛天依I.I.IGROKbyJUSF周存feat.洛天依一个奇怪的渐近估计之前在思考[数据删除]的做法时,想出了一个完全错误的方法。在计算复杂度......
  • 4-字符串-11-反转字符串-LeetCode344
    4-字符串-11-反转字符串-LeetCode344LeetCode:题目序号344更多内容欢迎关注我(持续更新中,欢迎Star✨)Github:CodeZeng1998/Java-Developer-Work-Note技术公众号:CodeZeng1998(纯纯技术文)生活公众号:好锅(Lifeismorethancode)CSDN:CodeZeng1998其他平台:CodeZeng1998、......