Linux网络编程中常用的字符串相关的函数

3 篇文章 0 订阅

1、strpbrk函数

#include<string.h>
char* strpbrk(char* s1, char* s2);

strpbrk()从第一个字符指针指向的位置 向后检查每个字符,直到遇到\0(不检查\0),如果检查到的某个字符在s2指向的字符串中,那么返回他的地址,并停止检查。

如果s1 、s2没有相同字符,返回NULL。

注:传入strpbrk函数的两个变量可以是一个指针,也可以是一个字符串。

2、strcasecmp函数

#include<string.h>
int strcasecmp(const char* s1, const char* s2);

忽略大小写地按字典序比较s1 、s2两个字符串。
返回值类型是int,如果s1 、s2相等,则返回0,如果是s1大,那么返回s1中第一个大于s2的字符的int型 正数ASCII 码,反之,返回s2中第一个大于s1的字符的int型 负数ASCII 码。

实例:

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

using namespace std;

int main()
{
	char a[30] = {"asdasd"};
	char b[30] = {"asdasdasda"};
	char* p;
	p = b;
	auto x = strcasecmp(p,a);
	printf("%d\n",x);
}

输出:

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

using namespace std;

int main()
{
	char a[30] = {"asdasd"};
	char b[30] = {"asdasd"};
	char* p;
	p = b;
	auto x = strcasecmp(p,a);
	printf("%d\n", x);
}

输出:

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

using namespace std;

int main()
{
	char a[30] = {"asdasd"};
	char b[30] = {"asdasdasda"};
	char* p;
	p = b;
	auto x = strcasecmp(p,a);
	printf("%d\n",x);
}

输出:

97

3、strncasecmp函数

#include<string.h>
int strncasecmp(const char* s1, const char* s2, size_t n);

与上面函数的区别:只比较前n个字符。

4、strspn函数

#include<string.h>
size_t strspn(const char* str, const char* accept);

计算字符串 str 中连续有几个字符属于字符串 accept,返回计算结果。
注意:

找的不是子串,也就是:对字符的顺序没有要求,只要这个字符在accept里面出现过就行
虽然对顺序没有要求,但是,这些字符必须连续,只要中间被一个accept没有的字符断开了,那么后面的就不算了,只算前面的。
从str的第一个字符开始计数,只要你str的第一个字符在accept里面都没出现过,那就不往下算了,直接返回0
实例:

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

using namespace std;

int main()
{
	char a[30] = { "asdasd"};
	char b[30] = { "asdasd"};
	char* p;
	p = b;
	auto x = strspn(p, a);		//正好完全匹配
	printf( "%ld\n", x);
	return 0;	
}

输出:

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

using namespace std;


int main()
{
	char a[30] = { "asdasd"};
	char b[30] = { "wasdasd"};
	char* p;
	p = b;
	auto x = strspn(p, a);		第一个 w 就不匹配了
	printf( "%ld\n", x);
	return 0;
}

输出:

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

using namespace std;

int main()
{
	char a[30] = { "asdasdw"};
	char b[30] = { "wasdasd"};
	char* p;
	p = b;
	auto x = strspn(p, a);		b 里的字符在 a 里面都能找到,与出现顺序无关
	printf( "%ld\n", x);return 0;
}

输出:

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

using namespace std;

int main()
{
	char a[30] = { "asdasd"};
	char b[30] = { "asdwasd"};
	char* p;
	p = b;
	auto x = strspn(p, a);		被 w 断开了
	printf( "%ld\n", x);return 0;
}

输出:

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

using namespace std;

int main()
{
	char a[30] = { "wasdasd"};
	char b[30] = { "asdwasd"};
	char* p;
	p = b;
	auto x = strspn(p, a);
	printf( "%ld\n", x);return 0;
}

输出:

7

5、strchr函数

#include<string.g>
char* strchr(const char* str, int c);

在str指向的字符串中寻找第一次出现字符c的位置,并返回指向该位置的指针,如果没找到则返回NULL。

注意:c的类型是int,但是在使用该函数时既可以传入一个字符(char类型的),也可以传入一个int型的ASCII码。

6、strncpy函数

#include<string.g>
char* strncpy(char* dest, const char* src, size_t n);

这是一个拷贝字符串的函数。他将src串中前n个字符依次拷贝到dest所指向的位置。

7、strstr函数

#include<string.h>
char* strstr(const char* havstack, const char* needle);

找到子串needle在 主串havstack中第一次出现的位置,返回的是指向该位置的指针。
返回值:找不到返回NULL。

8、strcasestr函数

char* strcasestr(const char* havstack, const char* needle);

和strstr函数的含义一样,只不过这个函数忽略大小写地找。

9、stat函数

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *buf);

首先使用该函数需要包含<sys/types.h>、<sys/stat.h>以及<unistd.h>这三个头文件。
函数参数及返回值含义如下:
pathname:用于指定一个需要查看属性的文件路径。
buf:struct stat 类型指针,用于指向一个 struct stat 结构体变量。调用 stat 函数的时候需要传入一个 struct stat 变量的指针,获取到的文件属性信息就记录在 struct stat 结构体中。
返回值:成功返回 0;失败返回-1,并设置 error。

struct stat 结构体

struct stat
{
	 dev_t st_dev; /* 文件所在设备的 ID */
	 ino_t st_ino; /* 文件对应 inode 节点编号 */
	 mode_t st_mode; /* 文件对应的模式 */
	 nlink_t st_nlink; /* 文件的链接数 */
	 uid_t st_uid; /* 文件所有者的用户 ID */
	 gid_t st_gid; /* 文件所有者的组 ID */
	 dev_t st_rdev; /* 设备号(指针对设备文件) */
	 off_t st_size; /* 文件大小(以字节为单位) */
	 blksize_t st_blksize; /* 文件内容存储的块大小 */
	 blkcnt_t st_blocks; /* 文件内容所占块数 */
	 struct timespec st_atim; /* 文件最后被访问的时间 */
	 struct timespec st_mtim; /* 文件内容最后被修改的时间 */
	 struct timespec st_ctim; /* 文件状态最后被改变的时间 */
};

st_dev:该字段用于描述此文件所在的设备。不常用,可以不用理会。
st_ino:文件的 inode 编号。
st_mode:该字段用于描述文件的模式,譬如文件类型、文件权限都记录在该变量中。
st_nlink:该字段用于记录文件的硬链接数,也就是为该文件创建了多少个硬链接文件。链接文件可以分为软链接(符号链接)文件和硬链接文件。
st_uid、st_gid:此两个字段分别用于描述文件所有者的用户 ID 以及文件所有者的组 ID。
st_rdev:该字段记录了设备号,设备号只针对于设备文件,包括字符设备文件和块设备文件,不用理会。
st_size:该字段记录了文件的大小(逻辑大小),以字节为单位。
st_atim、st_mtim、st_ctim:此三个字段分别用于记录文件最后被访问的时间、文件内容最后被修改的时间以及文件状态最后被改变的时间,都是 struct timespec 类型变量。

10、va_list函数

va_list 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。

void va_start(va_list ap, last_arg);
  • ap: 这是一个 va_list 类型的对象,它用来存储通过 va_arg 获取额外参数时所必需的信息
  • last_arg: 是最后一个传递给函数的已知的固定参数,即省略号之前的参数
#include<stdarg.h>
#include <stdlib.h>
 
void sum(char* msg, ...)
{
    va_list vaList;                        //定义一个va_list型的变量
    va_start(vaList, msg);                 //va_start初始化vaList
    int first = va_arg(vaList, int);       //va_arg获取第一个参数
    char* second = va_arg(vaList, char*);  //va_arg获取第二个参数
    int third = va_arg(vaList, int);       //va_arg获取第三个参数
    va_end(vaList);                        //va_end结束vaList,将vaList置NULL
 
    char str[256]{0};
    va_start(vaList, msg);
    vsprintf(str, msg, vaList); //配合格式化字符串,输出可变参数
    va_end(vaList);
    printf("%s", str);
 
    return;
}
 
 int main()
 {
     sum("hello world %d %s %d", 9, "666", 3);
     system("pause");
     return 0;
 }

11、va_end函数

void va_end(va_list ap)

va_end 宏用于清理 va_list 指针。它必须在函数返回前调用,以确保释放所有使用的资源。这个宏没有参数,只需要传递指向 va_list 的指针即可。

12、snprintf函数

snprintf 是一个 C 标准库函数,用于格式化字符串,并将结果存储到一个字符数组中,同时限制字符串的长度

 int snprintf(char *str, size_t size, const char *format, ...);
  • str:这是一个指向字符数组的指针,用于存储格式化后的字符串。
  • size:这是目标字符数组的最大容量,也就是可以写入的最大字符数(包括 null 终止符)。
  • format:这是一个格式化字符串,用于指定输出的格式,类似于 printf 中的格式化字符串。
  • :这是可选的参数,用于填充格式化字符串中的占位符。
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    char buffer[20];
    int num = 42;
    int result = snprintf(buffer, sizeof(buffer), "The answer is %d", num);
 
    if (result >= 0 && result < sizeof(buffer)) {
        printf("Formatted string: %s\n", buffer);
    } else {
        printf("Buffer was not large enough.\n");
    }
    return 0;
}

13、vsnprintf函数

vsnprintf,用于格式化字符串并将结果存储到字符数组中,与 snprintf 类似,但它允许你使用变长参数列表(va_list)来传递参数。这使得你可以更灵活地生成格式化后的字符串。

int vsnprintf(char *str, size_t size, const char *format, va_list ap);
  • str:这是一个指向字符数组的指针,用于存储格式化后的字符串。
  • size:这是目标字符数组的最大容量,也就是可以写入的最大字符数(包括 null 终止符)。
  • format:这是一个格式化字符串,用于指定输出的格式,与 printf 或 snprintf 中的格式化字符串相同。
  • ap:这是一个 va_list 类型的参数,其中包含了格式化字符串中使用的可变参数。
#include <stdio.h>
#include <stdarg.h>
 
void customPrintf(char *buffer, size_t size, const char *format, ...) {
    va_list args;
    va_start(args, format);
    vsnprintf(buffer, size, format, args);
    va_end(args);
}
 
int main() {
    char buffer[20];
 
    customPrintf(buffer, sizeof(buffer), "The answer is %d", 42);
 
    printf("Formatted string: %s\n", buffer);
 
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
strpbrk函数是一个C语言字符串处理函数,其功能是在源字符串按从前到后顺序找出最先含有搜索字符串任一字符的位置并返回位置指针。如果找不到匹配的字符,则返回空指针NULL。\[1\] 下面是strpbrk函数的算法实现: ```c char* strpbrk(const char* str, const char* strCharSet) { while (*str) { const char* pSet = strCharSet; while (*pSet) if (*pSet++ == *str) return (char*)str; ++str; } return NULL; } ``` 下面是strpbrk函数的一个示例用法: ```c #include <stdio.h> #include <string.h> int main(void) { const char str1\[\] = "HelloWorld"; const char str2\[\] = "AAAAAAAAAW"; const char str3\[\] = "BBBBBBBBBB"; char* ret1 = strpbrk(str1, str2); char* ret2 = strpbrk(str1, str3); printf("%s\n", ret1); printf("%s\n", ret2); // 在VScode返回为空即什么都没有,在vc++6.0返回为null return 0; } ``` 需要注意的是,strpbrk函数的声明如下: ```c char* strpbrk(const char* str1, const char* str2); ``` 其,str1是要被检索的C字符串,str2是包含了要在str1进行匹配的字符列表。函数返回一个指向匹配字符的位置的指针,如果没有找到匹配的字符,则返回空指针NULL。\[3\] #### 引用[.reference_title] - *1* [C语言str族函数strpbrk()函数介绍及其算法实现](https://blog.csdn.net/weixin_42844163/article/details/104105812)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C语言strpbrk()函数](https://blog.csdn.net/BlizCp/article/details/112059658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值