常识
1. char [ ] ==》 string
直接赋值;
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
char c[] = "123";
str = c;
cout << str << endl;
cout << str.length() << endl;
return 0;
}
2. string ==》 char [ ]
3种方法:
(1)调用 string 的 data 函数
【注】:data除了返回字符串内容外,不附加结束符'\0'
【注】:const char* 与 char*之间用const_cast转换符;
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str = "abc";
const char *p;
p = str.data();
char *q;
q = const_cast<char*>(str.data());
cout << "p: " << p << endl;
cout << "q: " << q << endl;
return 0;
}
//可以返回tchar值
void test(char* tchar)
{
string s1 = "1.0";
//tchar = const_cast<char*>(s1.data());//返回空
char* ch = const_cast<char*>(s1.data());
memcpy(tchar,ch,s1.length()*sizeof(char));
}
(2)调用 string 的 c_str 函数
【注】:使用string提供的函数c_str() ,返回一个以‘\0’结尾的字符数组。
推荐使用strcpy函数
#include<iostream>
#include<string>
using namespace std;
int main()
{
const char* c;
string s = "1234";
c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理
cout << c << endl;
char d[20];
strcpy_s(d, const_cast<char*>(s.c_str()));
cout << d << endl; //最好用strcpy_s
return 0;
}
(3)调用 string 的 copy 函数
如:
string str="hello";
char p[40];
str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='/0'; //要手动加上结束符
cout < <p;
【注】:
a. string可以被看成是以字符为元素的一种容器, 字符构成序列(字符串)。
另,strcpy函数在高版本的vs中无法使用的问题
原因:一般认为是vs准备弃用strcpy的,安全性较低,所以微软提供了strcpy_s来代替。
然而,strcpy_s并没有strcpy好用,我们要想继续在VS2015中使用strcpy该怎么办 呢?下面是几种解决方法
解决方法:
1. 其实在下面的输出错误信息中有解决方法,“To disable deprecation , use _CRT_SECURE_NO_WARNINGS”,意思是我们可以不进行兼容性检查,我们可以在项目-属性-配置属性-c/c++-预处理器-预处理定义里边加上一句:_CRT_SECURE_NO_WARNINGS ,如下图所示
2. 也是在下面的输出信息中,我们可以看到有一处错误代号“ error C4996:”,所以我们可以在程序开头加上一句
“#pragma warning(disable:4996)”就行,意思是忽略这个错误,如下图
3. 可以在:项目-属性-配置属性-c/c++中的常规,里面有个SDL选项,关了。还有在代码生成中有个安全检查选项(/GS),关了。虽然这种方法也可以解决这个问题,但是我本人不太提倡这种解决办法,还是前两种解决方法比较好
参考文章;
1. https://www.cnblogs.com/devilmaycry812839668/p/6353807.html
2. https://www.cnblogs.com/mdumpling/p/8179167.html
3. https://www.cnblogs.com/dmego/p/6065144.html strcpy函数在VS2015无法使用的问题