2013-08-07 41 views
0

我正在写一个程序,让用户从库存中添加或删除汽车。现在, 我想让用户选择一个汽车名称而不是显式指定名称,我创建了一个结构CriteriaSelector,其中数组名称companyList将存储公司的价值,当我让用户选择汽车名称时,它会将companyList中某个字符串的字符串复制到名为carname的char数组中,然后将其复制到CarData对象的carname char数组中。如何将字符串数组的值复制到char数组中?

事情是,每当我编译下面的代码,我得到的错误说,在27行'companyList'之前预期说明符限定符列表,我不知道该怎么办? 任何人都可以帮忙吗?

#include <stdio.h> 
#include <stdlib.h> 


#define MAX_WORD_LENGTH 20 


typedef struct cardata{ 

    char carname[MAX_WORD_LENGTH]; 
    char carmodel[MAX_WORD_LENGTH]; 
    char caryear[MAX_WORD_LENGTH]; 
    char cartype[MAX_WORD_LENGTH]; 
    int quantity; 

}CarData; 


struct node{ 

    CarData data; 
    struct node *next; 
    struct node *prev; 
}*start=NULL; 




typedef struct criteriaselector{ 

    const char *companyList[10]; 
    companyList[0] = "Toyota"; <-- This is where error is happening!!(Line 27) 
    companyList[1] = "Honda"; 
    companyList[2] = "Hyundai"; 
    companyList[3] = "Nissan"; 
    companyList[4] = "Mitsubishi"; 
    companyList[5] = "Volksvagon"; 
    companyList[6] = "Acura"; 
    companyList[7] = "Ford"; 
    companyList[8] = "Dodge" 
    companyList[9] = "GMC"; 

}CriteriaSelector; 


void insert_first(){ 
    struct node *ptr; 
    CriteriaSelector criteriaselector; 
    char carname[MAX_WORD_LENGTH]; 
    char carmodel[MAX_WORD_LENGTH]; 
    char caryear[MAX_WORD_LENGTH]; 
    char cartype[MAX_WORD_LENGTH]; 
    int carQuantity; 
    int ch; 
    printf("\nChoose your car"); 
    printf("\n\n\n1.Toyota \n2.Honda \n3.Hyundai \n4.Nissan \n5. Mitsubishi \n6. Volksvagon \n7. Acura \n8. Ford \n9. Dodge \n10. GNC Exit\n"); 
    scanf("%d", &ch); 
    strcpy(carname,criteriaselector.companyList[ch-1]); 


    printf("\n\nEnter the car model: "); 
    scanf("%s", carmodel); 
    printf("\n\nEnter the car year: "); 
    scanf("%s", caryear); 
    printf("\n\nEnter the car type: "); 
    scanf("%s", cartype); 
    printf("\n\nEnter the quantity of models: "); 
    scanf("%d", &carQuantity); 



    if(start==NULL){ 

     start=(struct node *)malloc(sizeof(struct node)); 
     strcpy(start->data.carname,carname); 
     strcpy(start->data.carmodel,carmodel); 
     strcpy(start->data.caryear,caryear); 
     strcpy(start->data.cartype,cartype); 
     start->data.quantity=carQuantity; 
     start->prev=NULL; 
     start->next=NULL; 

    }else{ 

     ptr=start; 
     start=(struct node *)malloc(sizeof(struct node)); 
     strcpy(start->data.carname,carname); 
     strcpy(start->data.carmodel,carmodel); 
     strcpy(start->data.caryear,caryear); 
     strcpy(start->data.cartype,cartype); 
     start->data.quantity=carQuantity; 
     start->next=ptr; 

    } 

} 


void delete_first(){ 

    struct node *ptr; 
    char carname[MAX_WORD_LENGTH]; 
    char carmodel[MAX_WORD_LENGTH]; 
    char caryear[MAX_WORD_LENGTH]; 
    char cartype[MAX_WORD_LENGTH]; 
    char modelNumber[MAX_WORD_LENGTH]; 
    int carQuantity; 

    if(start==NULL){ 
     printf("\n\nLinked list is empty.\n"); 
    }else{ 
     ptr=start; 
     printf("\nThe car for which the entry is removed is %s \n",ptr->data.carname); 
     strcpy(start->data.carname,carname); 
     strcpy(start->data.carmodel,carmodel); 
     strcpy(start->data.caryear,caryear); 
     strcpy(start->data.cartype,cartype); 
     start->data.quantity=carQuantity; 
     start=start->next; 
     free(ptr); 
    } 
} 


void display() 
{ 
    struct node *ptr=start; 
    int i=1; 

    if(ptr == NULL){ 
     printf("\nLinklist is empty.\n"); 
    }else{ 
     printf("\nSr. No Make  Model Year Type Quantity\n"); 
     while(ptr != NULL){ 
      printf("\n%d.\t%s %s %s %s %d\n", i,ptr->data.carname,ptr->data.carmodel,ptr->data.caryear,ptr->data.cartype,ptr->data.quantity); 
      ptr = ptr->next; 
      i++; 
     } 

    } 
} 


int main(void) 
{ 
    int ch; 
    do 
    { 
     printf("\n\n\n1. Insert \n2. Delete \n3. Display \n4. Exit\n"); 
     printf("\nEnter your choice: "); 
     scanf("%d", &ch); 

     switch(ch) 
     { 

      case 1: 
       insert_first(); 
       break; 
      case 2: 
       delete_first(); 
       break; 
      case 3: 
       display(); 
       break; 
      case 4: 
       exit(0);            
      default: 
       printf("\n\nInvalid choice. Please try again. \n"); 

     } 

    } while(1); 


    return EXIT_SUCCESS; 
} 
+0

“第27行”没有帮助,因为我们看不到行号。你可以在产生错误的实际行旁放置注释吗? – verbose

+0

嗨!我已经编辑了这篇文章,你可以看看吗? – user1036587

+0

尝试'const char * companyList [10] = {“Toyota”,“Honda”,...}等。而不是'companyList [0] =“Toyota”'等。这是否有效? – verbose

回答

1

您不能将结构的定义与初始化混合在一起。

typedef struct criteriaselector{ 

    const char *companyList[10]; 
    companyList[0] = "Toyota"; // This bit needs to be elsewhere. 

取而代之,在声明结构的实例后,您需要填写值。例如:

typedef struct criteriaselector{ 
    const char *companyList[10]; 
} 
..... 

void some_function() { 
    CriteriaSelector criteriaselector; 
    criteriaselector.companyList[0] = "Toyota" 
    .... etc 

但是,它看起来像你打算做一个常数,而不是描述一个结构。代替整个结构定义,你可以这样做:

const char *criteriaselector[10] = {"Toyota", "Honda" ... } 

在全球范围内的某处。这将声明一个常量字符串的“全局”数组。


顺便说一句,const在这里的工作方式有一点微妙之处。这个声明说“定义一个指向常量字符的指针数组”。这意味着你不能自己改变字符串,但你可以改变指针。所以,你不能这样做:

criteriaselector[1][0] = '\0' // changing a character inside a const string 

但是,你可以这样做:

criteriaselector[1] = "some other string". 

这可能不是你的意思。相反,我们可以说“define an array of constant pointers to constant strings”,像这样:

const char * const criteriaselector[10] = {"Toyota", "Honda" ... } 

这样的话,你将无法改变字符串,或字符串的内容都指向。

对此的评论question that I linked对此进行了更详细的解释。

+0

当我声明companyList数组时,我是否会将此行放入函数中? – user1036587

+0

我已经更新了答案,希望能够使其更加清晰。 –

+0

谢谢,提摩太! – user1036587

0

您不能初始化结构中的变量。这是因为一个结构定义了一个类型而不是一个变量。您可以使用结构变量(您的案例中的criteriaselector)和.->访问说明符来初始化结构定义之外的结构成员。 例如,

criteriaselector.companyList [0] =“Ford”;

相关问题