C/C++ string和char数组对比

本文详细介绍了C++中字符串处理的不同方式,包括string类与char数组的区别、读取/输出方式、互相转换的方法等内容。

string是c++特有的,使用时需添加头文件#include<string>

(一)#include<string.h>和#include<cstring>以及#include<string.h>区别

<string.h>

<string.h>是C版本的头文件,包含比如strcpy、strcat之类的字符串处理函数。

<cstring>

在C++标准化(1998年)过程中,为了兼容以前,标准化组织将所有这些文件都进行了新的定义,加入到了标准库中,加入后的文件名就新增了一个"c"前缀并且去掉了.h的后缀名,所以string.h头文件成了cstring头文件。但是其实现却是相同的或是兼容以前的,这就是<cstring>的来源,不要觉得又多了一个东西。相当于标准库组织给它盖了个章,说“你也是我的标准程序库的一份子了”。

<string>

<string>是C++标准定义的头文件,它定义了一个string的字符串类,里面包含了string类的各种操作,如s.size(), s.erase(), s.insert()等。但<string>又包含了老的C版本的字符串操作如strcpy、strcat等,这就相当于,在<string>的文件中除了定义自己的string类之外,还加了一个#include<string.h>一句包含了C版本的字符串操作。

 

没有<cstring.h>这样的头文件。

(二)读取/输出方式

 1 #include<string>
 2 #include<stdio.h>
 3 #include<iostream>
 4 using namespace std;
 5 int main(){
 6     string str,str1;
 7     char a[100],b[100];
 8     cin>>str;
 9 //    scanf("%s",str1);//错误!!!string类型不可以用scanf输入 
10     cin>>a;
11     scanf("%s",b);    
12 }

同理,string和char数组均可以使用cin/cout进行输入输出操作。但是string不能通过scanf/printf, 以及puts()和gets()进行输入输出操作。而char数组可以

(三)string类-->char *

     首先必须了解,string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些

成员函数比如begin()、end(),迭代器可以根据他们进行定位。

注意,与char*不同的是,string不一定以NULL('\0')结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。

     把string转换为char* 有3种方法: 
1.data
如:
string str="abc";

char *p=(char *)str.data();

2.c_str
如:

string str="gdfd";

char *p=str.c_str();

3. copy
如:

string str="hello";

char p[40];

str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置

*(p+5)='\0'; //要手动加上结束符

 (四)char[]-->string类

直接赋值即可。

 1 #include<string>
 2 #include<stdio.h>
 3 #include<iostream>
 4 using namespace std;
 5 int main(){
 6     string str;
 7     char p[100];
 8     cin>>p;
 9     str=p;
10     cout<<str<<endl;
11 }

暂时这些 以后再添加

 

转载于:https://www.cnblogs.com/Elaine-DWL/p/6545380.html

### C++ 中 `string` 转换为 `char` 数组的方法 在C++中,存在多种方式可以将标准库中的字符串(`std::string`)转换成字符数组(`char[]`)。 #### 使用 `c_str()` 方法 此方法返回一个指向以 null 结尾的常量字符数组的指针。该函数非常适合用于需要传递给期望接收 C 风格字符串参数的情况[^4]。 ```cpp #include <iostream> using namespace std; int main(){ string str = "hello world!"; const char* c = str.c_str(); cout << c; } ``` #### 使用 `data()` 方法 与 `c_str()` 类似,不过它并不总是保证返回的结果是以 null 终止符结束的字符串;因此,在某些情况下可能不适合直接作为 C 字符串来处理。 ```cpp #include <iostream> using namespace std; int main(){ string str = "hello world!"; char *d = (char *)str.data(); // 注意这里强制类型转换只是为了演示目的,并不是推荐做法 cout << d; } ``` #### 使用 `copy()` 方法 这种方法允许指定目标缓冲区以及要复制的最大字节数目。这提供了更灵活的操作选项,同时也避免了潜在的安全隐患。 ```cpp #include <iostream> #include <cstring> // 或者<string.h>, 为了使用memset, strcpy等函数 using namespace std; int main(){ string str = "hello world!"; char buffer[20]; memset(buffer, '\0', sizeof(buffer)); // 初始化buffer str.copy(buffer, min(str.size(), size_t(19)), 0); // 复制最多19个字符以防溢出 cout << buffer; } ``` 上述三种都是有效的解决方案,具体选择取决于实际应用场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值