#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
/*
1, C语言中字符用单引号,字符串用双引号
由于C语言中没有真正的字符串类型,可以通过字符数组表示字符串,因为它的元素地址是连续的,这就足够了
C语言中字符串的表示:
一是定义一个字符指针,并把该字符串首字符的地址传给他; char *name = "abc";
二是定义一个字符数组,并把字符串存入该字符数组中。 char name[] = "abc";
两种方式都行,但是第一种 name 是指针,代表一个地址,是不能改的
第二种是字符数组, name是可以改的
对于字符数组,其长度是固定的,其中任何一个数组元素都可以为 null 字符。因此,字符数组不一定是字符串。
对于字符串,它一定是字符数组,它是最后一个字符为 null 字符的字符数组。
对于字符指针,是把字符串首字符的地址传给他, C语言中操作字符串是通过它在内存中的存储单元的首地址进行的
2,C++ 提供了以下两种类型的字符串表示形式:
C 风格字符串;
C++ 引入的 string 类类型 string
3,C++中char是字符类型,是一种基本数据类型,而string是一个模板类,实例化的是对象,它的内部是封装了const char*类型
4,C语言中由于指针的灵活性,导致指针能代替数组使用,或者混合使用,这些导致了许多指针和数组的迷惑,
C语言中规定数组代表数组所在内存位置的首地址,也是 str[0]的地址,即str = &str[0];
*/
/*
2,转换
*/
/*
3,常用方法
C++ 中有大量的函数用来操作以 null 结尾的字符串:
strcpy(s1, s2); 复制字符串 s2 到字符串 s1。
strlen(s1); 返回字符串 s1 的长度。
strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。
*/
int main(void)
{
/*字符数组赋初值*/
char cArr[] = { 'I','L','O','V','E','C' }; // 等价于 char cArr[6] = {'I','L','O','V','E','C'};这是字符数组,不是字符串
/*字符串赋初值---字符数组*/
char sArr[] = "ILOVEC"; // 编译时会自动在末尾增加一个null字符(也就是'\0')等价于char cArr[7] = {'I','L','O','V','E','C','\0'}. 等价于char sArr[7] = "ILOVEC";
/*字符串赋初值---字符指针*/
char *p = "ILOVEC"; // 字符指针,把字符串首字符的地址传给他,char *p 只是一个保存字符串首地址的指针变量
/*用sizeof()求长度*/
printf("cArr的长度=%d\n", sizeof(cArr)); // cArr的长度=6
printf("sArr的长度=%d\n", sizeof(sArr)); // sArr的长度=7
printf("p的长度=%d\n", sizeof(p)); // sArr的长度=8,这里得到是指针的长度
/*用strlen()求长度*/
printf("cArr的长度=%d\n", strlen(cArr)); // 随机值,因为这里不知道'/0'在哪里,所以我们这里的长度时要直到遇到‘/0’才会结束。
printf("sArr的长度=%d\n", strlen(sArr)); // sArr的长度=6
printf("p的长度=%d\n", strlen(p)); // sArr的长度=6,这里得到的是字符串长度
/*用printf的%s打印内容*/
printf("cArr的内容=%s\n", cArr); // 对字符数组,很显然使用 printf 的 %s 打印其内容是不合适的,因为不知道'/0'在哪里,
printf("sArr的内容=%s\n", sArr); // 对于字符串 sArr,可以直接使用 printf 的 %s 打印其内容
printf("p的内容=%s\n", p); // 对于字符串 sArr,可以直接使用 printf 的 %s 打印其内容
return 0;
}
// 转换
int test() {
// char[] 转 char*, 直接赋值
char str1[] = "abc";
char *str11 = str1;
// char* 转 char[], 字符拷贝
const char * str = "abc";
char str2[10] = {0}; // 这里10个元素会被赋值为 null 字符(空字符,就是指'\0')
// char *strncpy(char *dest, const char *src, size_t n) 把src所指向的字符串复制到dest,最多复制 n 个字符
strncpy(str2, str, strlen(str) + 1);
// char*转string
const char *str = "abcd";
string str1 = str; //赋值转换
string str2(str, str + strlen(str));//构造转换
//string转char*:赋值转换
string str44 = "abc";
char *str1 = const_cast<char *>(str44.c_str()); //const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性
const char *str2 = str44.c_str(); // c_str()函数返回一个指向C字符串的指针常量,指向的内容是字符串对象的当前内容加上一个额外的终止字符(‘\ 0’)
cout << "str1:" << str1 <<" " << "str2:" << str2 << endl;
// char[]转string
char str44[] = "abc";
string str1 = str44;
// string转char[]
string str55 = "12345";
char str21[5] = { 0 };
strncpy(str21, str55.c_str(), str55.length() + 1);
return 0;
}