#include
char* strpbrk(char* s1, char* s2);
strpbrk()从第一个字符指针指向的位置 向后检查每个字符,直到遇到\0(不检查\0),如果检查到的某个字符在s2指向的字符串中,那么返回他的地址,并停止检查。
如果s1 、s2没有相同字符,返回NULL。
注:传入strpbrk函数的两个变量可以是一个指针,也可以是一个字符串。
#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
#include
int strncasecmp(const char* s1, const char* s2, size_t n);
与上面函数的区别:只比较前n个字符。
#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
#include
char* strchr(const char* str, int c);
在str指向的字符串中寻找第一次出现字符c的位置,并返回指向该位置的指针,如果没找到则返回NULL。
注意:c的类型是int,但是在使用该函数时既可以传入一个字符(char类型的),也可以传入一个int型的ASCII码。
#include
char* strncpy(char* dest, const char* src, size_t n);
这是一个拷贝字符串的函数。他将src串中前n个字符依次拷贝到dest所指向的位置。
#include
char* strstr(const char* havstack, const char* needle);
找到子串needle在 主串havstack中第一次出现的位置,返回的是指向该位置的指针。
返回值:找不到返回NULL。
char* strcasestr(const char* havstack, const char* needle);
和strstr函数的含义一样,只不过这个函数忽略大小写地找。
#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 类型变量。
va_list 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。
void va_start(va_list ap, 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;
}
void va_end(va_list ap)
va_end 宏用于清理 va_list 指针。它必须在函数返回前调用,以确保释放所有使用的资源。这个宏没有参数,只需要传递指向 va_list 的指针即可。
snprintf 是一个 C 标准库函数,用于格式化字符串,并将结果存储到一个字符数组中,同时限制字符串的长度
int snprintf(char *str, size_t size, const char *format, ...);
#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;
}
vsnprintf,用于格式化字符串并将结果存储到字符数组中,与 snprintf 类似,但它允许你使用变长参数列表(va_list)来传递参数。这使得你可以更灵活地生成格式化后的字符串。
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
#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;
}