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

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

  • 1、strpbrk函数
  • 2、strcasecmp函数
  • 3、strncasecmp函数
  • 4、strspn函数
  • 5、strchr函数
  • 6、strncpy函数
  • 7、strstr函数
  • 8、strcasestr函数
  • 9、stat函数
  • 10、va_list函数
  • 11、va_end函数
  • 12、snprintf函数
  • 13、vsnprintf函数

1、strpbrk函数

#include
char* strpbrk(char* s1, char* s2);

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

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

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

2、strcasecmp函数

#include
int strcasecmp(const char* s1, const char* s2);

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

实例:

#include
#include
#include

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
#include
#include

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
#include
#include

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
int strncasecmp(const char* s1, const char* s2, size_t n);

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

4、strspn函数

#include
size_t strspn(const char* str, const char* accept);

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

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

#include
#include
#include

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
#include
#include

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
#include
#include

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
#include
#include

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
#include
#include

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
char* strchr(const char* str, int c);

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

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

6、strncpy函数

#include
char* strncpy(char* dest, const char* src, size_t n);

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

7、strstr函数

#include
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 
#include 
#include 
int stat(const char *pathname, struct stat *buf);

首先使用该函数需要包含以及这三个头文件。
函数参数及返回值含义如下:
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
#include 
 
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 
#include 
 
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 
#include 
 
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;
}

你可能感兴趣的:(Linux,C++,开发语言)