C/C++字符串函数
不受限制
字符串的长度
strlen(const char* s)
在s中遇到’\0’为止,返回字符串长度
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char str[10] = "Hello";
int len = strlen(str);
printf("%d\n", len);//求出长度为5,不会算'\0'
//sizeof()就会加上'\0'
int sz = sizeof(str);
printf("%d\n", sz);//求出数组总大小包括'\0'
return 0;
}
字符串的拷贝
字符串拷贝(全部拷贝过来,不受限制)
strcpy(char* des , const char* src)
把src中的内容拷贝至des,如果des中有数据,就会被全部覆盖
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char s[10] = "hello";
char* s2 = "world";
printf("原数据:%s\n", s);
strcpy(s, s2);
printf("拷贝后的数据:s = %s\n", s);
return 0;
}
注意:目标字符串的长度空间要大于原字符串长度空间。
字符串的追加
字符串追加(全部追加过来,不受限制) strcat(char* des,const char* src)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char str[15] = "hello";
char* sr = "world";
strcat(str, sr);
printf("追加后:%s\n", str);
return 0;
}
注意:目标字符串长度空间要大于原字符串长度空间
sizeof(str)>sizeof(sr)
字符串的比较
字符串比较 (原字符串全部比较,不受限制)
strcmp(char* des,const char* src)
=0 相等
0 字符串des大于字符串src
<0 字符串des小于字符串src
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
//比较结果三种不同的值
char s1[10] = "Hello";
char s2[10] = "Worldhhh";
char s3[10] = "A";
char s4[10] = "Hello";
int l1 = strcmp(s1, s2);//小于
printf("l1 = %d\n", l1);
int l2 = strcmp(s1, s3);//大于
printf("l2 = %d\n", l2);
int l3 = strcmp(s1, s4);//相等
printf("l3 = %d\n", l3);
return 0;
}
字符查找
strchr(char* des,int c)
在字符串des中查找字符src找到了就返回第一次出现
src的地址,没找到返回NULL指针
int main()
{
char s[10] = "helda";
char s2 = 'e';
printf("e 首地址:%d\n", &s[1]);
char* sz = strchr(s, s2);
printf("sz 返回首地址 = %d", sz);
}
在s中找到了字符e,返回e的地址
运行结果:
受限制
字符串拷贝(受限制,指定长度拷贝)
strncpy(char* des, const char* src,unsigned int size)
des是要拷贝到哪个字符串中
src是要拷贝的源字符串首地址,size是指要拷贝的字符的个数
int main(){
char s[10] = "hello";
char s2[10] = { 0 };
strncpy(s2, s, 4);
printf("s2 = %s", s2);
}
我只截取了前面4位所以显示hell
字符串追加(受限制,指定长度追加)
strncat(char* des, const char* src,unsigned int size)
des是要追加到哪个字符串后面
src是要追加的源字符串首地址,size是指要追加的字符的个数
int mian()
{
char s[10] = "hello";
char s2[10] = "wo";
strncat(s, s2, 1);
printf("s = %s", s);
}
我只追加了一个字符,所以hello只追加一个字符
运行结果:
字符串比较(受限制,指定长度比较)
strncmp(char* des, const char* src,unsigned int size)
des是要比较的目的字符串
src要比较的源字符串是首地址,size是指要比较的字符的个数
int main()
{
char s[10] = "hello";
char s2[10] = "helda";
int ret = strncmp(s, s2, 3);
printf("ret = %d", ret);
}
我只比较了前面3个字符,所以返回0是相等的
运行结果:
字符串查找(受限制,指定长度查找)
strstr(char* des,const char* src)
在字符串des中查找src,找到了,就返回第一次出现的src的首地址,没找到返回NULL指针
int main()
{
char s[10] = "helda";
char s2[10] = "helzs";
printf("s2 首地址:%d\n", s2);
char* sz = strstr(s, s2);
printf("sz 返回首地址 = %d",sz );
}
未找到返回空指针
运行结果:
字符串分段
strtok(char* des,const char* src)
字符串des中找到src就返回src之前的字符串
在之后strtok(NULL,src)继续查找src找到了就返回上一次找到的src之后到这一次找到的src之前的字符串直至找不到就会返回空指针。
int main()
{
char s[10] = "hel";
char s2[10] = "helsada";
char * res = strtok(s2, s);
printf("res = %#x\n", res);
char* ret = strtok(NULL, s);
printf("ret = %d", ret);
}
在s2中截取了s那一段,s2找到s之前的字符串首地址
运行结果
内存操作函数
内存拷贝
void *memcpy(void dest, const void src, size_t n)
我们可以看见,str1,str2都是void的返回类型也是void所以它可以拷贝包括自定义类型的内存
n表示拷贝的长度
int main(){
char s[10] = "hello";
char s2[10];
memcpy(s2, s, 3);
printf("s2 = %s", s2);
}
我只拷贝了3个字符所以s2只有hel
运行结果:
内存移动覆盖
void * memmove ( void * destination, const void * source, size_t num )
从source中移动num长度的字符到destination,从destination首地址开始覆盖
返回移动好的首地址
int main(){
char s[10] = "hello";
char s2[10] = "why";
memmove(s, s2, 2);
printf("s = %s", s);
}
我把s2中的前2个字符移到了s中,并且覆盖了s中的前两个字符。
运行结果:
内存设置(常用于初始化)
void * memset(void* str,int c,size_t n)
将str的前n个字符的内容全部设置为c-----我们常用于初始化
返回设置好的首地址
int main(){
char s[10] = "hello";
char s2[10];
memset(s2, 'a', sizeof(char) * 10);
for (int i = 0; i < sizeof(char)*10; i++)
{
printf("s2 = %c\n", *(s2 + i));
}
}
我把字符串s2全部初始化为’a’
运行结果:
内存比较
void* memcmp(const void* ptr1,const char* ptr2,size_t num)
把ptr2的前num个字节与ptr1进行比较
ptr1 > ptr2返回大于零的值
ptr1 = ptr2返回零
ptr1 < ptr2返回小于零的值
int main(){
char s[10] = "hello";
char s2[10] = "hels";
int ret1 = memcmp(s, s2, 3);
int ret2 = memcmp(s, s2, 4);
printf("ret1 = %d\n", ret1);
printf("ret2 = %d", ret2);
}
第一次我比较前三个字符,相等返回0
第二次我比较前四个字符,s比s2小返回-1