char[]叫做字符数组。char* 叫做字符指针。是C语言中对字符串操作的方式。
1. 字符数组char[]的定义、初始化、赋值方式
////声明
char str1[4]; // char str1[n] : 声明一个字符数组并给其分配n个内存空间
///声明并赋值
char str2[10] = "hello"; //直接对字符数组进行初始化,初始化内容的长度可以小于分配的大小。
char str2[10] = {'h','e','l','l','o'}; //sizeof(str2) = 10
char str2[] ={'h','e','l','l','o'}; // sizeof(str2) = 5
////声明后单个赋值
char str3[10];
str3[0] = 'h', str3[1] = 'e' // 分配内存后赋值,单个字符单个地赋值。
////
char str4[10];
strcpy(str4, "hello");
strncpy(str4, "hello", strlen("hello")+1);
不可以的赋值方法:
char str[10];
str = "hello"; //这种赋值方法是错误的。
str[10] = "hello"; 也不行
总之,要么声明时直接赋值,要么声明后一个一个赋值(感觉用到的比较少),声明后要么使用strcpy系列function进行赋值。
另外,声明数组的时候如果没有进行初始化,就必须指明数组的长度。
如果只是 :char a[] 会报错: error: storage size of ‘a’ isn’t known
2.字符指针的声明、初始化、赋值
本质为指针。
char* str ="hello";
//或者
char* str;
str = "hello";
赋值时没有字符数组那么多限制。
(但是其指向的内容由编译器分配在文字常量区,所以无法改变其值。)
但是,char* p = "abc";这样的赋值方式编译时会报warning:
warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
可以改成下面:
char* p = (char*) "abc";
//或者:
char const* p = "abc";
这是因为,“abc”对于C++来说类型为const char*, 是不变的。所以保持等号两边类型相等,才不会报warning。否则编译器会强制转换。
3. char[]转char*
可以直接赋值
char str1[] = "helloa";
char* str2 = NULL;
str2 = str1;
4. char* 转char[]:
不能直接赋值,可以使用strcpy函数
char* str = "hehe";
char str2[] = "haha";
strcpy(str2, str1);
///or
strncpy(str2, str1, strlen(str1)+1);// 一定要+1
// cout<< str2的结果是---> hehe
5. string 转char[]
依然是使用strcpy拷贝,拷贝时要将string进行.c_str()的转换
string ts = "my home";
char st1[100];
strcpy(st1, ts.c_str());
6. char[]转string
可以直接赋值
char str[] = "hello";
string st1 = str;
7.string转char*
用c_str()进行格式转换
通过c_str()转成 const char*
再通过const_cast<char>转成char
string st = "my test";
char *st1 = const_cast<char*>(st.c_str());
8.char*转string
直接赋值
char* st = "hello";
string st1 = st;