2013-08-07 34 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」;

相關問題