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="<<ch3<<endl;  //输出结果 ch3=a cup

//string
string str1,str2;
cin>>str1;
str2=str1;  //正确,string类型可以使用“=”

string str3 = "give me";
string str4 = "a cup";
str3.assign(str4,0,5);       // 第2个参数“0”为起始位置,第3个参数“5”为字符数
 cout<<"str3="<<str3<<endl;  //输出结果 str3=a cup
//string支持丰富的操作函数

2 - 合并
char[] 需要通过strcat函数实现
而string则可以通过“+”,简单实现
[1]全部合并
//char[]
char ch1[15] = "give me "; // 注意长度,避免越界,合并后为13
char ch2[] = "a cup";
strcat(ch1,ch2);   //strcat()将字符串ch2接到ch1后面
cout<<"ch1="<<ch1<<endl;  //输出结果 ch1=give me a cup

//string
string str1 = "give me ";
string str2 = "a cup";
str1 = str1 + str2;
cout<<"str1="<<str1<<endl;  输出结果 str1=give me a cup

[2]部分合并
//char
char ch1[10] = "ab";  // 注意合并后的长度
char ch2[] = "abc";
strncat(ch1,ch2,3);    // 参数3为从起始位置起的字符数
cout<<"ch1="<<ch1<<endl;  //输出结果 ch1=ababc

//string
string str1 = "ab";
string str2 = "cdefg";
str1.append(str2,2,3); // 参数2为数组下标,参数3为参数2后字符数。即将str2从下标为2位置起3个字符合并到str1
cout<<"str1="<<str1<<endl;  //输出结果 str1=abefg

3 - 字符串长度获取
char[]使用函数strlen获取字符串长度
string使用.size或.length获取,也可以先转换为char[]再获取长度
//char
char ch1[] = "give me";
int m = strlen(ch1);  //不包括‘\0’
cout<<"m="<<m<<endl; //输出结果:m=7

//string
string str1 = "give me";
int m = strlen(str1.c_str());  
cout<<"m="<<m<<endl;//输出结果:m=7
     
int n = str1.size();
cout<<"n="<<n<<endl; //输出结果: n=7 

int k = str1.length();
cout<<"k="<<k<<endl;//输出结果:k=7

4 - 替换
//char
char ch1[10] = "ab";
  char ch2[] = "cdefg";
  strncpy(ch1,ch2,3);       // 拷贝ch2起始位置后3个字符赋给ch1
  cout<<"ch1="<<ch1<<endl; //输出结果:ch1=cde

//string 
string str1 = "ab";
  string str2 = "cdefgh";
  str1.replace(0,1,str2,4,2);  // 将str2从下标4开始2个字符替换掉str1中从起始位置开始1个字符
                // replace函数可重载,有多种形式,也支持Char型字符替换
  cout<<"str1="<<str1<<endl;//输出结果:str1=ghb
  
5 - 获取整行输入
//char
char str2[1024];
cin.getline(str2,1024);//读入char数组

//string
string str;
getline(cin,str);//读入string



3 - 转换

C++中char类型可以自动转换成string类型,即可以用char类型字符串直接给string类型变量赋值

(1)char  >>>   string

//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 <iostream>
#include <string>

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 <iostream>
#include <string>

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
*/

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值