c - 如何将字符串数组的值复制到字符数组?

标签 c data-structures struct compiler-errors linked-list

我正在编写一个程序,允许用户从库存中添加或删除汽车。现在, 我试图让用户选择汽车名称而不是明确说明名称,我创建了一个结构 CriteriaSelector,其中数组名称 companyList 将存储公司的值,当我让用户选择汽车名称时,它将从特定的 companyList 复制一个字符串索引到名为 carname 的 char 数组,然后将其复制到 CarData 对象中的 carname 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;
}

最佳答案

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

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更详细地解释一下。

关于c - 如何将字符串数组的值复制到字符数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18093026/

相关文章:

algorithm - Tarjan 和 Mihaescu 的 "*simpler* real-time catenable deque"工作在哪里?

c - 如何在 C 中动态分配二维数组?

c - 当我按下按钮时,如何取消选中 GTK 中的复选框?

C - printf 里面的 "if"语句不显示

c - 我应该为 C 使用什么图形库

c - sprintf ("%!ld"是什么)?

javascript - 我检查图形是否为二叉树总是返回 false

c++ - OpenMP 的理想数据结构

c - 在结构中访问结构

c++ - 使用循环从外部文件填充结构