注册 登录
编程论坛 C++教室

c++ primer plus第6版练习题9 问题求组

yehunyou 发布于 2013-12-19 11:21, 495 次点击
题目为:
结构CandyBar保护3个成员,第一个是存储糖果品牌,第二个是存储糖果重量,第三个是存储糖果卡路里含量。现在是编写一个程序,创建一个使用new的动态分配数组,该数组为包含3个元素的CandyBa数组,然后初始化各个元素,并显示出来。 大概就是这么个意思。
我写的代码:
#include<iostream>
int main()
{
using namespace std;
struct CandyBar
{
char name[30];
double weight;
int calorie;
};
CandyBar *snack=new CandyBar[3];

snack[0]{"third",2.7,5};





cout <<snack[0].name <<snack[0].calorie <<snack[0].weight ;
cout <<snack[1].calorie <<snack[1].name <<snack[1].weight ;
cout <<snack[2].calorie <<snack[2].name <<snack[2].weight ;
delete [] snack;
return 0;
}
问题就是 在,建立动态指针数组后, 怎么给 snack赋值。我的理解是此snack是个指针数组,那个就可以使用指针数组的赋值方法,即 snack[0]表示第一个元素,可以直接给赋值。 但是编译器 看见赋值符合就是那个大括号就 报错,
高人指点指点,迷茫啊,没搞懂为什么就不行呢。
8 回复
#2
wp2319572013-12-19 15:24
大约是这个样子吧  

程序代码:

#include<iostream>

using namespace std;

int main()
{
    struct CandyBar
    {
        char name[30];
        double weight;
        int calorie;
    };
    CandyBar *snack=new CandyBar[3];
    strcpy(snack[0].name,"third");
    snack[0].weight=8.5;
    snack[0].calorie=19;

    strcpy(snack[1].name,"bbbbbbb");
    snack[1].weight=7.5;
    snack[1].calorie=9;

    strcpy(snack[2].name,"th5ffffird");
    snack[2].weight=15.5;
    snack[2].calorie=29;

    for(int i=0; i<3; i++)
    {
        printf("%30s  %.2f  %d  \n",snack[i].name,snack[i].weight,snack[i].calorie);
    }
    delete [] snack;
    return 0;
}



[ 本帖最后由 wp231957 于 2013-12-19 15:26 编辑 ]
#3
yehunyou2013-12-19 16:39
回复 2楼 wp231957
这种也能够运行,
但是我其实比较像知道,为什么  我的这种写法 会错误,这个错误在什么地方呢
还有   
赋值的方法, snack[0].name=“def” 这种方法为什么也不行,非得用你所写的那种复制的strcay 这种方式,毕竟 使用snack[0].weight=5 这种形式都是被允许的。
能解释下吗?
#4
犬虫门心本人2013-12-19 17:04
你定义的name成员是一个数组,数组名称是常量,不能被赋值的!
你的程序编译的错误提示大概应该是:
= needs l-value
这个意思是说,=需要左值。所谓的左值就是变量。而数组名称是常量。
再说,看题目的意思应该是定义类类型啊,你定义的是结构体,这是哪跟哪啊!
#5
zuojian1682013-12-19 20:45
#include<iostream.h>
int main()
{

struct CandyBar
{
char name[30];
double weight;
int calorie;
}snack[3]={"third",2.7,5,"two",9.9,0,"one",1.2,3};
//CandyBar *snack=new CandyBar[3];




cout <<snack[0].name <<snack[0].calorie <<snack[0].weight ;
cout <<snack[1].name <<snack[1].calorie <<snack[1].weight ;
cout <<snack[2].name <<snack[2].calorie <<snack[2].weight ;
//delete [] snack;
return 0;
}
#6
yehunyou2013-12-20 10:15
回复 4楼 犬虫门心本人
感谢回答,但是第一句话就说了 这个是一个结构!
另外 数组初始化这个问题,哎,是读书不够认真啊。
数组的初始化只能够在定义的时候进行初始化,其他的时候就不被允许了。
数组不是常量,毕竟可以使用它进行 cin操作。只是数组初始化规则 不允许了而已。
#7
yehunyou2013-12-20 10:20
这里用new动态分配数组,已经是一个初始化过程了,指针都有相应地址了, 后面是一个赋值的过程了。
#8
i802862013-12-20 10:31
CandyBar是一个结构体,其中包含了三个变量,“snack[0]{"third",2.7,5}”从你的角度看是没问题,但编译器就不知道这三个值究竟赋给谁,赋值的顺序是没有规则可用
#9
阿呆不高2013-12-21 00:39
回复 3楼 yehunyou
name作为数组名,也就是数组的首地址,很明显它是不变的。再看strcpy这个函数的原型声明:extern char *strcpy(char* dest, const char *src);很明显是将把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。字符串可以看作是每个字母组成的数组,字符串"third"即为数组char  buf[30]={'t','h','i','r','d'}那么该函数执行其实就是dest=name;src=buf;*dest=*src;dest++;src++;假设dest空间足够大,循环次数为strlen(buf)+1;很明显和对name直接赋值不一样。任何对数组名的赋值行为都是不可以的。
1