c++中string类字符串和c中char*/char[]型型字符串的区别

本文详细解析了C语言和C++中字符串的处理方式,包括C语言中使用char数组表示字符串的方法,以及C++引入string类带来的便利性和高级功能。通过示例对比了char数组、string类和vector容器在字符串操作上的不同。
概念区分

在c中,是没有string类型的数据的。但是c语言里有<string.h>这个头文件。容易让人误认为c中有string类型的数据。

区分string的含义:

1)(在c和c++中)如果string表示字符串型数据,那么c中是有字符串类型数据的(用char[]或者char *来声明定义)。但是没有string类型数据。而c中的<string.h>这个头文件里声明的函数原型也全是针对char数组的种种操作,如strcmp,strcpy,strcat等。

2)(在c++中)如果string表示string类型,那么c++中才有,c中没有。string在c++中是一种特殊的类。string 和 vector、list一样,都是标准库类型。 string 类型支持长度可变的字符串,C++ 标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。

需要:

#include <string>
using std::string;

c++中string类,示例:

  1. #include<iostream>  
  2. #include<string>  
  3. using std::string;  
  4. using namespace std;  
  5. int main(){   
  6. string s = "abcdefg";  
  7. string::iterator i;//支持迭代器   
  8. for(i=s.begin();i!=s.end();i++)  
  9.   cout<<*i<<" ";//逐个输出string s中的元素   
  10.  system("pause");  
  11.  return 0;  
  12. }  

与vector容器区别,例:

  1. #include<iostream>  
  2. #include<vector>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6. vector<string> s(5,"abcdefg");  
  7. vector<string >::iterator i;  
  8. for(i=s.begin();i!=s.end();i++)  
  9.   cout<<*i<<" ";//逐个输出vector s中的元素   
  10.  system("pause");  
  11.  return 0;  
  12. }  


c中的字符串

错误示例:

int main(int argc, char* argv[])
{
char *n;
n=new char[20];
n="Hello World";
printf("%s\n",n);
return 0;
}
上述代码有误,指出其中三个错误:
第一,C语言里没有new。
C中是这样的:
char * n;
n = (char *)malloc(sizeof(char) * 20);
第二,分配的空间在栈中,不能给它直接等堆里的常量。
n = "Hello, World!"; // 错
应该是 strcpy(n, "Hello, World!");
第三,C/C++中分配了空间要释放。
C++中new了就要delete,其中 new [] 和 delete []配对,new 和 delete 配对。
C中用malloc分配的内存对应的是 free。
所以上述代码中需要要 free (n)。

静态内存分配示例:

  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {  
  5.     char *p;  
  6.     p="hello";  
  7.     cout<<p<<endl;  
  8.     system("pause");  
  9. }  


参考:

基础备忘:new\delete和malloc\free及memset

字符串指针与char型指针数组

基础备忘:字符数组、字符串和字符串处理基本函数

char*参数构造函数和string参数构造函数

另外,不建议采用

  1. char *a=  new char[20];  
  2.   
  3. a="hello world";//不建议这么用,会产生常量歧义:指针a被常量化为"hello world",就好比a=NULL。建议采用strcpy(a,"hello world");或者strcpy_s(a,"hello world");的方式  
  4.   
  5. delete []a;  
### C++ 中 `char` 字符串 `std::string` 的转换方法 #### 1. **从 `std::string` 转换到 `const char*`** 可以通过调用成员函数 `.data()` `.c_str()` 来实现这一转换。这两种方式都返回指向内部存储的字符数据的常量指针。 - 使用 `.data()`: ```cpp std::string str = "good boy"; const char* p_data = str.data(); ``` - 使用 `.c_str()`: ```cpp std::string str = "good boy"; const char* p_cstr = str.c_str(); ``` 两者的主要区别在于,`.c_str()` 明确保证返回的结果是以 `\0` 结尾的字符串,而 `.data()` 则可能不总是如此[^1]。 --- #### 2. **从 `std::string` 转换到可修改的 `char*`** 如果需要获取一个可以被修改的 `char*` 字符串,则需手动分配内存并拷贝内容: ```cpp std::string str = "good boy"; int len = str.length(); char* p_char = new char[len + 1]; strcpy(p_char, str.c_str()); // 记得释放动态分配的内存 delete[] p_char; ``` 或者使用更现代的方式通过 `malloc` 进行动态分配: ```cpp std::string str = "good boy"; int len = str.length(); char* p_char = (char*) malloc((len + 1) * sizeof(char)); if (p_char != nullptr){ strcpy(p_char, str.c_str()); } free(p_char); ``` 注意,在这种情况下,必须负责管理所分配的内存资源[^1]。 --- #### 3. **从 `char*` 或 `char[]` 转换到 `std::string`** 可以直接利用 `std::string` 构造器完成此操作: - 将 `char*`/`char[]` 赋值给 `std::string` 对象: ```cpp char c_arr[] = "hello world!"; std::string str(c_arr); ``` - 如果只是简单初始化也可以这样写: ```cpp char c_ptr[] = "another example"; std::string another_string = c_ptr; ``` 此外还可以指定范围来创建子串: ```cpp char long_text[50] = "This is a very long text."; std::string subStr(long_text, 5); // 截取前五个字符 ``` 以上展示了如何基于特定位置构建新的字符串实例[^2][^3]。 --- #### 总结代码示例 以下是综合上述几种情况的一个完整例子: ```cpp #include <iostream> #include <string> using namespace std; int main(){ // String to Const Char* string str1 = "Original Text"; const char* ptr_const = str1.c_str(); cout << "Const Pointer: " << ptr_const << endl; // To Modifiable Char Array size_t length = str1.size(); char* modifiable_array = new char[length + 1]; strncpy(modifiable_array, str1.c_str(), length); modifiable_array[length] = '\0'; cout << "Modifiable Copy: " << modifiable_array << endl; delete []modifiable_array; // From Char Array/String Literal To Std::String char fixed_buffer[] = {'H', 'e', 'l', 'o'}; string from_fixed(fixed_buffer); cout << "From Fixed Buffer: " << from_fixed << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值