C++字符串复习

1、C++的字符串必须和C语言的字符串有一个好的区分。
比如说我们在C语言里面定义字符串是使用

char str[]="helloworld";

这个时候默认为str字符串数组分配了长度为11的数组,str存放了数组的首地址,a[10]末尾以 ‘\0’为结尾,这个时候数组的总长度应11.
定义字符串在C语言里面还可以使用指针来定义,

char* str = "helloworld";

这个时候str是一个指针(数组名不是指针),它指向了字符串字符串的首地址h,这个时候可以把字符串看成是一块内存,它的值其实相当于是一个数组的首地址,是一个常量,其实这样写是存在隐患的,下面详细解释。
查看内存窗口:

2、一些常用的字符串库函数:
在C中,函数原型存在 <string.h>头文件中。
在C++中,则存在于头文件中。
1、strcpy(s1, s2);
原型:char * strcpy(char * destination,const char * source);
复制字符串 s2 到字符串 s1。

#include <iostream>
#include <string>
using namespace std;
/************************************************************************/
/* strcpy是一种C语言的标准库函数,
/  strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*。                                                            */
/************************************************************************/
int main()
{
// 	char str1[] = "hello";
// 	char str2[] = "world";
	
// 	char str1[] = "hello"; 
// 	char* str2 = "world"; //做右值时,编译器把它当作地址,其是不可变的,作为左值时是一个常量,如"world"[1] = 'j';(报错)

	char* str1 = "hello0000";  //可以通过编译,但是运行时会报错
	//原因较为复杂,详见:https://blog.csdn.net/zhoudaxia/article/details/4325326
	char* str2 = "world"; //做右值时,编译器把它当作地址,其是不可变的
	char* str3 = strcpy(str1, str2);

	return 0;
}

2、strcat(s1, s2);
原型:char * strcat(char * destination,const char * source);
连接字符串 s2 到字符串 s1 的末尾,幷返回s1的首地址。

// 	char* str1 = "he";
// 	char* str2 = "lloworld";
// 	char* str = strcat(str1, str2);
	/************************************************************************/
	/* 上面这个是禁止的,str1所指向的内存大小只有两个字节,这个操作内存溢出,看正确的追加方式
	/************************************************************************/
	char str3[20] = "he";    //一定要保证空间足够大
	char str4[10] = "lloworld";
	char* str = strcat(str3, str4);
	printf("\n");

3、strlen(s1);
原型:size_t strlen(const char * str);
返回字符串 s1 的长度。

/************************************************************************/
/* 它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,
直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。                                                                   */
/************************************************************************/
int main()
{
	char* str1 = "he";
	char* str2 = "lloworld";
	int len1 = strlen(str1);  //遇到‘\0’结束,返回字节数=2
	int len2 = sizeof(str1); //返回一个变量所占的字节数 = 4(指针占4个)
	int len3 = strlen(str2);
	int len4 = sizeof(str2);

	printf("");
	return 0;
}

4、strcmp(s1, s2);
原型:int strcmp(const char * str1,const char * str2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。

int main()
{
	char str1[] = "hello";
	char str2[] = "world";

	char str3[] = "world";
	char str4[] = "hello";

	char str5[] = "world";
	char str6[] = "world";
	int rst1 = strcmp(str1, str2); //str1<str2返回-1
	int rst2 = strcmp(str3, str4); //str1>str2返回1
	int rst3 = strcmp(str5, str6); //str1==str2返回0

	return 0;
}

5、strchr(s1, ch);
原型:extern char *strchr(const char *s,char c)
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。

int main()
{
	char str1[] = "hello";
	char* p = strchr(str1, 'o');
	return 0;
}

6、strstr(s1, s2);
原型:char * strstr ( const char *, const char * );
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

int main()
{
	char str1[] = "hello";
	char str2[] = "llo";
	char* p = strstr(str1,str2);
	return 0;

使用这些函数的时候需要特别注意char* str, char str[], const char* str 的区别,这也是C过渡到C++遗留下来令人头疼的问题。
可以查看大佬的博客,写的挺好的:https://blog.csdn.net/zhoudaxia/article/details/4325326
/
找个时间再写一下C++的字符串使用。

页面下部广告