c++中string类字符串和c中char*/char[]型型字符串的区别
2012-09-18 10:44
323 查看
概念区分
在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++ 标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。
需要:
c++中string类,示例:
![](http://img.my.csdn.net/uploads/201209/18/1347935494_7685.jpg)
与vector容器区别,例:
![](http://img.my.csdn.net/uploads/201209/18/1347935732_6675.jpg)
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)。
静态内存分配示例:
![](http://img.my.csdn.net/uploads/201210/01/1349073466_3997.png)
参考:
基础备忘:new\delete和malloc\free及memset
字符串指针与char型指针数组
基础备忘:字符数组、字符串和字符串处理基本函数
char*参数构造函数和string参数构造函数
以下是CSDN论坛一个相关帖子:
帖子
在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类,示例:
#include<iostream> #include<string> using std::string; using namespace std; int main(){ string s = "abcdefg"; string::iterator i;//支持迭代器 for(i=s.begin();i!=s.end();i++) cout<<*i<<" ";//逐个输出string s中的元素 system("pause"); return 0; }
![](http://img.my.csdn.net/uploads/201209/18/1347935494_7685.jpg)
与vector容器区别,例:
#include<iostream> #include<vector> using namespace std; int main() { vector<string> s(5,"abcdefg"); vector<string >::iterator i; for(i=s.begin();i!=s.end();i++) cout<<*i<<" ";//逐个输出vector s中的元素 system("pause"); return 0; }
![](http://img.my.csdn.net/uploads/201209/18/1347935732_6675.jpg)
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)。
静态内存分配示例:
#include<iostream> using namespace std; int main() { char *p; p="hello"; cout<<p<<endl; system("pause"); }
![](http://img.my.csdn.net/uploads/201210/01/1349073466_3997.png)
参考:
基础备忘:new\delete和malloc\free及memset
字符串指针与char型指针数组
基础备忘:字符数组、字符串和字符串处理基本函数
char*参数构造函数和string参数构造函数
另外,不建议采用
char *a= new char[20]; a="hello world";//不建议这么用,会产生常量歧义:指针a被常量化为"hello world",就好比a=NULL。建议采用strcpy(a,"hello world");或者strcpy_s(a,"hello world");的方式 delete []a;
以下是CSDN论坛一个相关帖子:
帖子
相关文章推荐
- c++中string类字符串和c中char*/char[]型型字符串的区别
- string类字符串和char*/char[]型型字符串的区别
- C++ string char* char[]声明的字符串的区别---补充(17)《Effective C++》
- C/C++ | 字符串处理 char*数组 string类
- C++中string类的处理字符串构造函数用法, 以及getline cin.getline()输入的区别
- 深入分析C++中char * 和char []的区别
- C字符串和C++字符串的区别
- C++【String类】String插入单个字符,插入字符串的函数实现
- C/C++如何把一个特定分隔符分割的字符串划分为一个字符串数组,strtok(char *,char*)分割函数
- C++字符串string类常用操作详解(一)【初始化、遍历、连接】
- C++ const char* 常量字符串拼接问题
- 深入分析C++中char * 和char []的区别
- C++字符串存储及string类
- 深入分析C++中char * 和char []的区别
- char varchar nchar nvarchar 四者的区别是什么(为何SQL Server自动给字符串末尾加空格)
- C++字符串数组赋值与单个字符赋值区别
- C++中的字符串的输入输出函数、空字符与空格的区别、字符变量赋值和字符串初始化
- C++ char *c 与char []区别
- char a[](字符串数组)和char *a(字符串指针)区别
- TCHAR、wchar_t、char及字符串处理函数区别