初始化结构变量时出错?

时间:2013-08-13 03:43:37

标签: c

我很困惑为什么在初始化结构变量时出现错误。我在Stack Overflow上找到了一些相关的线程,但它们没有解决我的问题。任何人都可以解释导致问题的原因吗?

 //I have used Dev-C++ compiler
 //Getting an error 'b1' undeclared
  struct book
 {
           char name ;
            float price ;
            int pages ;
  };

   struct book b1;     

  int main()
 {

    /* First i have tried following way to initialize the structure variable,
    but compiler throws the error 

    b1 = {"John", 12.00, 18};

    */

     //I have tried to initialize individually ....but still getting error...?

     b1.name = "John";
     b1.price = 12.3;
     b1.pages = 23;

     printf ( "\n%s %f %d", b1.name, b1.price, b1.pages );


     system("pause");
     return 0;
  }

4 个答案:

答案 0 :(得分:0)

<强>问题

  1. 只有一个字节内存可用于name字段。像char name[100]

  2. 一样使用
  3. 使用strcpy()代替b1.name = "John";

答案 1 :(得分:0)

您显然想要struct中的字符串变量,但您将其声明为char name;字符)。

而是使用char指针(const char *name)或char数组(char name[100])。在后一种情况下,您必须使用strcpy(b1.name, "John")

答案 2 :(得分:0)

问题是您已将name声明为char。这意味着name只会包含一个char,而不是整个字符串。

您可以将name静态分配为char

的数组
char name [25]  // or whatever length you think is appropriate
                // remember to leave room for the NUL character

然后,您需要使用strcpy()将实际名称复制到结构中。

或者,您可以将name声明为char:

的指针
char* name;

在这种情况下,您可以将指针设置为字符串文字:

name = "John";

但在大多数现实生活中,这不是一个选项,因为您将从文件或标准输入中读取名称。因此,您需要将其读入缓冲区,将指针设置为堆上动态分配的内存(缓冲区的字符串长度为NUL的+1),然后使用strcpy()

答案 3 :(得分:0)

您必须对代码进行一些调整才能使其正常工作。

char name;  // only one byte is allocated.

定义char数组以在C中存储字符串。

char name[20]; //stores 20 characters
char *name; //Pointer variable. string size can vary at runtime.

为结构创建对象后,只能使用该对象提供数据。

(即)object.element = something;

b1 = {"John", 12.00, 18}; // Not possible

只有在定义对象时才可以进行上述初始化。

struct book b1={"John", 12.00, 18}; //Possible

如果在struct中定义了 char * name ,则可以执行以下操作。

struct book b1;
b1.name="John";   // Possible
b1.price=12.00;   // Possible
b1.pages=18;      // Possible

如果使用字符数组字符名称[20] ,则可以执行以下操作。

struct book b1;
strcpy(b1.name,"John");  // Possible
b1.price=12.00;     // Possible
b1.pages=18;       // Possible