相关的函数
strchr 字符匹配函数
strstr 字符串匹配
memset 内存空间填充函数
atoi/atol/atof 字符串转换
strtok 字符串分割
1.strchr字符匹配函数
在参数 str 所指向的字符串中搜索第一次出现字符c(一个无符号字)的位置。
char *strchr(const char *str, int c)
参数说明:
str – 要被检索的 C 字符串。
c – 在 str 中要搜索的字符。
返回值
该函数返回在字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL。
2.strstr字符串匹配
在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’。
char *strstr(const char *haystack, const char *needle)
返回值 该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 NULL。
3.memset内存空间填充函数
用常量字节c填充s所指向的内存区域str的前n个字节。
void *memset(void *str, int c, size_t n);
参数说明
str – 指向要填充的内存块。
c – 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n – 要被设置为该值的字符数。
返回值
该值返回一个指向存储区 str 的指针。
4.atoi/atol/atof转换
a是ascii的意思
1.把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
int atoi(const char *str)
该函数返回转换后的整数,如果没有执行有效的转换,则返回零。
2.把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。
long int atol(const char *str)
该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
3.把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。
double atof(const char *str)
函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。
5.strtok
将一个字符串分解为一个由零或多个非空标记组成的序列。在第一次调用strtok()时,要解析的字符串应该在str中指定,在接下来的每次调用中,要解析相同的字符串,str必须为NULL。delim 为分隔符(可为多个)。
char *strtok(char *str, const char *delim)
str – 要被分解成一组小字符串的字符串。
delim – 包含分隔符的 C 字符串。 返回值
该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。
实质:将出现分隔符位置的字符改为 ‘\0’
第二次及以后调用 传NULL。
例如:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char str[] = "hello-world";
char *buf;
buf = strtok(str, "-");
cout << buf << endl;
buf = strtok(NULL, "-");
cout << buf << endl;
}
运行结果:
6.sprintf(组包)
按格式写入 str 所指向的字符串。
int sprintf(char *str, const char *format, ...)
str – 这是指向一个字符数组的指针,该数组存储了字符串。
format – 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。
format 标签属性是 %[flags][width][.precision][length]specifier
如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
例如:
sprintf(buf,"%d年%d月%d日",year,month,day);
7.sscanf(解包)
从字符串格式化读取输入。
int sscanf(const char *str, const char *format, ...)
str – 这是字符串,是函数检索数据的源。
format – 这是字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。
format 说明符形式为 [%[*][width][modifiers]type=]
返回值
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
例如:
char a[] = "2020year5month3day"; //从该字符串中得到年月日
int y, m, d = 0;
int g=sscanf(a,"%dyear%dmonth%dday",&y,&m,&d);
如果提取字符串,需注意遇到’\0’才停止。
一、
高级用法1: 使用%*s、%*d舍弃提取的字符串、整型内容
高级用法2: 使用%[n]s、%[n]d提取指定宽度n的字符串或数字
二、
%[a-z]表示按 提取 a-z的字符串 [ABC]提取ABC
三、
%[^ABC]不是ABC的都要
例如:
char buf[16] = {0};
char buf2[16] = {0};
char buf3[16] = {0};
int size = sscanf("y12346@dadaa.com", "%[^@]%*1s%[^.]%*1s%s", buf, buf2, buf3);
cout << buf << endl<< buf2 << endl << buf3 << endl;
结果: