C++ string和char的笔记

C++ 的 std::string 有什么缺点? - 知乎

C++之string类型详解 - 百度文库

1 - string是char的定义

string

         string是C++标准库(STL)中的类型,是一个,定义在 < string > 头文件中。里面包含了对字符串的各种常用操作,它较 char* 的优势是内容可以动态拓展,以及对字符串操作的方便快捷,用+号进行字符串的连接是最常用的操作。
char*

        char* 是一个指向字符的指针,是一个内置类型。可以指向一个字符,也可以表示字符数组的首地址(首字符的地址)。我们更多的时候是用的它的第二的功能,来表示一个字符串,功能与字符串数组char ch[n]一样,表示字符串时,最后有一个 '\0’结束符作为字符串的结束标志

2 - 区别

         研究区别首先要看一下char、char*、与string分别属于的指针、数组、对象。从这三个类型基本就可以看出区别在哪里。

char *s1; //s1是指向字符串的指针
char s2[1]; //s2是字符类型的一维数组
string s3; //s3是string类的对象

区别:

(1)char*与char[]

1 - char *a
    a是一个指向已知字符串的指针,实质是指针。
2 - char arr[]
    arr本身是一个字符串数组,arr指向该数组的第一个元素,实质是数组。
3 - char*a 与char arr[]
[1] 赋值区别
char s1[5];
char *s2;
s1 = "abcd";  //error
s2 = "abcd";  //correct

//s1是数组的名字,当成是常量指针,不可以作为左值修改。
//s2是一个指针变量,可以将其指向一个字符串常量
//使用char*定义字符串,不能改变字符串内的字符的内容,但却可以把另外一个字符串付给它
//使用char[]可以改变字符的内容

[2]大小区别
char str[] = {"abcd"},sizeof(str) = 5,strlen(str) = 4
char *str = {"abcd"}, sizeof(str) = 4,strlen = 4

[3]转换方法
 - 把char arr[]赋值给char *a
   很简单: 
    char arr[]={"qwer"};    
    char *a=arr;
 - 把char* 赋值给char arr[]
   需要通过循环来一个一个地赋值

(2)char和string

1 - 定义和赋值
//char
char ch1[30],ch2[30];
cin>>ch1;
ch2=ch1; //错误(报错:char表达式必须是可修改的左值),即只有在定义时char数组可以用“=”   
//可以使用strcpy来进行赋值
char ch3[] = "give me";
char ch4[] = "a cup";
strcpy(ch3,ch4);
cout<<"ch3="<>str1;
str2=str1;  //正确,string类型可以使用“=”

string str3 = "give me";
string str4 = "a cup";
str3.assign(str4,0,5);       // 第2个参数“0”为起始位置,第3个参数“5”为字符数
 cout<<"str3="<//1
//直接初始化 string s(char *)  
char ch [] = "abc";
string str(ch);//也可string str = ch;
//2
char c;
string str;
stringstream stream;
stream << c;
str = stream.str();
//3
char ch [] = "abc";
string str;
str = ch; //在原有基础上添加可以用str += ch;
如下例子:
//3-1
using namespace std;
#include 
#include 

int main() {
	int len; //字符个数
	cin >> len;
	char *arr = new char[len];
	int idx = 0;
	while (idx != len) {
		cin >> arr[idx++];
	}
	string str = "";
	for (int i = 0; i < len; ++i) {
		str += ar[i];
	}
	cout << str << endl;

	return 0;
}
/*终端显示
输入:3 a b c
输出:abc
*/

(2)string  >>>  char

//1 
//使用data()函数
string str = "abc";
char* p = (char*) str.data();
//2
//c_str()
char c[20]; 
string s="1234"; 
strcpy(c,s.c_str()); 
//2-1  
//C++中风格,因为C++中认为strcpy不安全,所有可以使用strcpy_s
string s="1234";
len = sizeof(s) + 1; 
char *c = new char[len]; 
strcpy_s(c,sizeof(s)+1,s.c_str()); 
// 2 - 这里的strcpy可以使用吗
//2-2
​string s = "Hello World!";
printf("%s", s.c_str()); //输出 "Hello World!"
//3
//copy()函数
char buf[10];
string str("ABCDEFG");
length = str.copy(buf, 9);
buf[length] = '\0';

(3)PS:

[1] - 关于c_str() 

语法: 
const char *c_str();
c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 

这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 
比如:

//错误
char* c; 
string s="1234"; 
c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理

//正确
char c[20]; 
string s="1234";
strcpy(c,s.c_str());   //c_str()返回的是一个临时指针,不能对其进行操作,所以cp到变量c中

//2 - 这里的原理可以去研究下
 

[2] 在C++中无法使用strcpy函数

注意,在C++中无法使用strcpy函数,它被认为是不安全的;
strcpy_s函数需要输入三个参数;
    参数1,存放复制的字符串,类型为char *;
    参数2,被复制的字符串的个数;
    参数3,被复制的字符串,类型为char *;
因为参数3类型为char *,需要用到c_str()函数进行转换

using namespace std;
#include 
#include 

int main() {
	string str;
	cin >> str;
	int len = str.size() + 1;
	char *arr = new char[len];
	//注意这里创建char数组时,无法使用变量创建,即下列格式错误
	//char arr[len];  原因是数组的数量len需要是一个常量
	strcpy_s(arr, len, str.c_str());
	for (int i = 0; i < (len - 1); ++i) {
		cout << arr[i];
	}
	cout << endl;
	return 0;
}
/*终端显示
输入:abc
输出:abc
*/

你可能感兴趣的:(C和C++,c++,开发语言)