5 字符串处理函数
约 1622 字大约 5 分钟
2025-04-05
字符串长度
#pragma 指令的作用是:用于指定计算机或操作系统特定的编译器功能 #pragma warning(disable:4996)在文件开始处写上这句话,即告诉编译器忽略 4996警告,strcpy、scanf.等一些不安全的标准c库函数在 vs 中可以用了
关于处理字符串的函数都需要导入string.h库
函数定义:
size_t strlen(const char* s);
函数功能: 测字符指针 s 指向的字符串中字符的个数,不包括\0
返回值:字符串中字符个数
字符串拷贝
strcpy
函数的声明: char * strcpy(char* dest,const char* src);
拷贝src 指向的字符串到 dest 指针指向的内存中,\0也会拷贝
函数的返回值:目的内存的地址
在使用此函数的时候,必须保证 dest 指向的内存空间足够大,否则会出现内存污染
内存污染
如果需要使用的空间不够大,就会占据后面已经使用过的空间存储新数据,而原本存在这个位置的数据被修改
strncpy
char * strncpy(char * dest, const char * src, size tn);
将 src 指向的字符串前n 个字节,拷贝到 dest 指向的内存中 返回值:目的内存的首地址
strncpy 不拷贝\0
如果 n 大于 src 指向的字符串中的字符个数,则在 dest 后面填充 n-strlen(src)个\0
字符串追加
strcat
函数声明:
char* strcat(char * dest, const char * src);
strcat 函数追加 src 字符串到 dest 指向的字符串的后面。追加的时候会追加\0 保证 dest 指向的内存空间足够大。
strncat
char* strncat(char * dest, const char * src,size tn);
追加 src 指向的字符串的前n个字符,到 dest 指向的字符串的后面。 如果n 大于 src 的字符个数,则只将 src 字符串追加到 dest 指向的字符串的后面追加的时候会追加\0
字符串比较
strcmp
函数声明:
int strcmp(const char * s1, const char * s2);
比较 s1 和 s2 指向的字符串的大小 比较的方法:逐个字符去比较 ascII 码
如果 s1 指向的字符串大于 s2 指向的字符串返回1 如果 s1 指向的字符串小于 s2 指向的字符串返回-1 如果相等的话返回 0
strncmp
函数声明:
int strncmp(const char * s1, const char * s2, size t n);
函数说明: 比较 s1 和 s2 指向的字符串中的前 n 个字符
字符串查找
strchar
函数声明: char strchr(const char * s,int c);
在字符指针 s 指向的字符串中,找 ascii 码为 c的字符注意,是首次匹配,如果 s 指向的字符串中有多个 ASCII为 的字符,则找的是第1个字符
返回值: 找到了返回找到的字符的地址 找不到返回 NULL
strrchar
函数声明: char * strchr(const char * s, int c);
末次匹配 在 s 指向的字符串中,找最后一次出现的 ASCII为c的字符
返回值: 末次匹配的字符的地址。
字符串匹配
strstr
char * strstr(const char * haystack, const char * needle);
在 haystack 指向的字符串中查找 needle 指向的字符串,也是首次匹配
返回值: 找到了找到的字符串的首地址 没找到返回 NULL
空间设定
函数声明:
void* memset(void * ptr,int value,size_t num);
将 ptr 指向的内存空间的num个字节全部赋值为 value
ptr: 指向任意类型的指针,即指向我们需要修改的内存 value:给 ptr 指向的内存空间的赋的值。 num:确定将ptr 所指的内存中的num 个字节全都用value代替
返回目的内存的首地址,即 ptr 的值
字符串和数值的转换
atoi字符串转整数
函数的声明:
int atoi(const char * nptr);
将nptr 指向的字符串转换成整数,返回转换后的整数,此值由将输入字符作为数字解析而生成。 如果该输入无法转换为该类型的值,则 atoi的返回值为 0
atol字符串转长整型
long atol(const char* nptr);
atof字符串转浮点型
double atof(const char* nptr);
字符串切割
strtok
函数声明:
char * strtok(char * str, const char * delim);
按照 delim 指向的字符串中的字符,切割 str 指向的字符串
按照 delim 指向的字符串中的字符,切割 str 指向的字符串。其实就是在 str 指向的字符串中发现了 delim 字符串中的字符,就将其变成\0调用一次 strtok 只切割一次,切割一次之后,再去切割的时候 strtok 的第一个参数传 NULL,strtok函数具有记忆功能传null意思是接着上次切割的位置继续切。如果传原来的str,原本第一个delim中的字符被修改为\0,函数遇到\0会以为到达了字符串末端就不会再往后运行了。
如果 str 字符串中出现了连续的几个 delim 中的字符,则只将第一个字符变成\0
格式化字符串操作
sprintf
int sprintf(char * buf, const char * format,……); 输出到 buf指定的内存区域。
char buf[201;
sprintf(buf"d:%d:%d",2013,10.1);
printf("buf=%s\n"buf);
sscanf
int sscanf(const char * buf,const char * format,···); 从 buf指定的内存区域中读入信息
int a, b,c;
sscanf("2013:10:1","%d:%d:%d"&a,&b,&c);
printf("%d,%d,%d\n",a,b.c);
高级用法
1、跳过数据:%* s 或%* d
sscanf("1234 5678","%*d %s",buf);//跳过 1234 ,然后隔一个空格获取字符串
printf("%s\n", buf);//5678
sscanf("1234 5678","%s",buf);
printf("%s\n,buf");//1234
%s是获取字符串,%* s是跳过字符串,%d是获取整数%* d是跳过整数,中间加一个空格是跳过空格 sscanf和scanf一样遇到空格时就停止获取
2、读指定宽度的数据:%[width]s
sscanf("12345678","%4s",buf);//获取前四个字符
print("%s\n",buf)//1234
3、支持集合操作:只支持获取字符串
%[a-z] 表示匹配 a到z 中任意字符(尽可能多的匹配)直到遇到不在此范围内的字符(或空格)就终止
%[aBc] 匹配a、B、c中一员 %[ ^aFc] 匹配非 aFc的任意字符 %[ ^a-z]表示读取除 a-z 以外的所有字符
贡献者
版权所有
版权归属:PinkDopeyBug