string,char*,char数组的区别

鑫有灵犀002 2011-09-21 07:20:11
望各位高人指点!!!!!!!!!
#include <iostream>
using namespace std;
#include <string>
#include <cstring>
struct candybar{
string name;
double weight;
int kaluli;
};
int main()
{
candybar snack={"wowo",1.2,100};//这句为什么编译通不过?
string a;
strcpy(a,"my");//为什么编译也通不过?
char *b="hello";
char *c="world";
strcpy(b,c);//????为什么编译能通过,不能执行?
return 0;
}
能详细说一下string, char[], char* 这三者的区别吗???
...全文
726 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
柯本 2011-09-24
  • 打赏
  • 举报
回复
看一下社区的帮助。有关结贴在第三点的第4小点
http://community.csdn.net/Help/HelpCenter.htm
鑫有灵犀002 2011-09-24
  • 打赏
  • 举报
回复
谢谢楼上给我讲的这么详细,我怎么给你加分了,告我,我给你加分
yang_jnu 2011-09-23
  • 打赏
  • 举报
回复
PPower回答的非常详细,可作参考。。。
关于:1、candybar snack={"wowo",1.2,100};
在我这边测试结论是跟编译器有关,环境为:IDE VC6, 编译器为默认时会出错,换为intel C++编译器时,编译通过,所以请换用较新的编译器试下
柯本 2011-09-23
  • 打赏
  • 举报
回复
对一些古老的编译器来说(VC6.0实在是太古老了,2008MS的产品,十几年了,现在都出VS2011了),C++的一些新标准不可使用。如果类中(对C++来说struct是特殊的class)有非基本类型(如类),它就不能初始化。
如果你一定要用vc6.0,可以这样:
#include <iostream>
using namespace std;
#include <string>
#include <cstring>
struct candybar{
string name;
double weight;
int kaluli;
candybar(string x,double y,int z)
{
name=x;
weight=y;
kaluli=z;
}
};
int main()
{
//candybar snack={"wowo",1.2,100};//这句为什么编译通不过?

candybar snack("wowo",1.2,100);
return 0;
}

当然,用
snack.name="wowo";
更方便些。
鑫有灵犀002 2011-09-23
  • 打赏
  • 举报
回复
C:\Users\Administrator\Desktop\新建文件夹 (2)\编程题\capter4\candybar.cpp(12) : error C2552: 'snack' : non-aggregates cannot be initialized with initializer list
执行 cl.exe 时出错.
这就是编译时的错误啊!
鑫有灵犀002 2011-09-23
  • 打赏
  • 举报
回复
我用的微软的visual c++6.0啊!真的不行
柯本 2011-09-22
  • 打赏
  • 举报
回复
candybar snack={"wowo",1.2,100};
这个应该可以编译,你用的是什么编译器?


#include <iostream>
using namespace std;
#include <string>
#include <cstring>
struct candybar{
string name;
double weight;
int kaluli;
};
int main()
{
candybar snack={"wowo",1.2,100};//这句为什么编译通不过?
string a;
a="my";
char *b="hello";
char *c="world";
b=c;
return 0;
}

以上程序在c++ builder(2010),gcc(4.15),vc(2008)都可以成功编译
估计是你编译器的问题
勉励前行 2011-09-22
  • 打赏
  • 举报
回复
struct candybar{
string name;
double weight;
int kaluli;
};
1、candybar snack={"wowo",1.2,100};//这句为什么编译通不过?
這個要看 string 的持貝構造函數,如果這樣不行的話,你可以改成明確匹配數據類型candybar snack={string("wowo"),1.2,100};

 string a;
2、strcpy(a,"my");//为什么编译也通不过?
數據類型不對,strcpy需要的參數是 char * , 真想這麼做的話,可以寫成strcpy(&*a.begin(),"my"); 但是要保障 a 中有足夠的空間,否則會越界,並且a的長度要剛好與"my"一樣,否則,讀取string a 的長度時可能對不上(這與版本相關)。也就是說,這樣的代碼是不穩定的,不該這麼做。

char *b="hello";
char *c="world";
3、strcpy(b,c);//????为什么编译能通过,不能执行?
這個是關於常字符串的話題,寫常字符串屬於未定義行為。可能會引發異常或其他問題,因為字符串常量在不同的編譯器中,可能被存放於不同的段上,而且相同的字符串常量,可能被優化,總之這是未定義行為,不同的編譯器可能有不同的執行結果。

string 是个类,也有叫結構,也是可以稱作一個数据类型的。只是叫法不一樣。
std::string 雖然屬於標准庫的一員,但是不同的編譯器,其實現是不一樣的具體也是有些差別的。
你說的結構的初始化語法 candybar snack={"wowo",1.2,100}; 類型明確匹配要好一些,否則難免在一些編譯器上通不過編譯,印象中,一些特殊的結構的初始化語法好象還是有爭議的話題,gcc vc bcb 就不大一樣。

char *a="hello";
char b[]="hello";
這兩個是不一樣的,b可以修改,而a存放於常量區,是只讀的,修改它,會導致未定義行為,這個要理解。
肆水東澤 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zzbinfo 的回复:]
string 这个是个类,不能称之为数据类型
char[] char型数组
char* 指向char类型的指针
[/Quote]

char[0]='a'和char * b="a"有什么区别?
鑫有灵犀002 2011-09-22
  • 打赏
  • 举报
回复
1、candybar snack={"wowo",1.2,100};//这句为什么编译通不过?
這個要看 string 的持貝構造函數,如果這樣不行的話,你可以改成明確匹配數據類型candybar snack={string("wowo"),1.2,100};

这个还不行啊?我试了!
zzbinfo 2011-09-21
  • 打赏
  • 举报
回复
string 这个是个类,不能称之为数据类型
char[] char型数组
char* 指向char类型的指针
discoveralan 2011-09-21
  • 打赏
  • 举报
回复
string: c++帮你做好的一个类类型,是以NULL为结束标志的字符数组
char[]: 字符数组
char* : 字符指针

char *b="hello"; --字面值字符串,const类型,不能被修改
char *c="world"; --同上

哈哈,本人初学,这只是俺的理解,不知是否正确!

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧