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++的字符串使用。