c语言c078报错 太多的初始化器值

`


#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
#include 


typedef struct {
    char username[11];
    int level;
    char faction[6];
} User;


typedef struct node {
    User data;
    struct node* next;
} Node;


typedef struct {
    Node* head;
    Node* tail;
} Queue;


void initQueue(Queue* q) {
    q->head = NULL;
    q->tail = NULL;
}

int isQueueEmpty(Queue* q) {
    return (q->head == NULL);
}


void enqueue(Queue* q, User data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    if (q->tail == NULL) {
        q->head = newNode;
    }
    else {
        q->tail->next = newNode;
    }
    q->tail = newNode;
}


void dequeue(Queue* q, User* data) {
    Node* temp;
    *data = q->head->data;
    temp = q->head;
    q->head = q->head->next;
    free(temp);
    if (q->head == NULL) {
        q->tail = NULL;
    }
}

void generateUser(User* user) {
    int i;
    char charset[] = { "abc1234561", "def2222222", "ghi3333333", "opq4444444", "rst5555555", "uvw6666666", "xyz7777777", "ABC1111111", "DEF1234567", "GHI0987654" };
    for (i = 0; i < 11; i++) {
        user->username[i] = charset[rand() % (sizeof(charset) - 1)];
    }
    user->username[10] = '\0';
    user->level = rand() % 60 + 1;
    switch (rand() % 3) {
    case 0:
        strcpy(user->faction, "red");
        break;
    case 1:
        strcpy(user->faction, "blue");
        break;
    case 2:
        strcpy(user->faction, "green");
        break;
    default:
        break;
    }
}


int enqueueUsers(Queue* q, int numUsers) {
    int i;
    User user;
    for (i = 0; i < numUsers; i++) {
        generateUser(&user);
        enqueue(q, user);
    }
    return 0;
}

// test main
int main(int argc, char* argv[]) {
    int numUsers;
    User user;
    Queue q;
    srand(time(NULL));
    if (argc != 2) {
        printf("Usage: %s numUsers\n", argv[0]);
        return 1;
    }
    numUsers = atoi(argv[1]);
    if (numUsers <= 0) {
        printf("Invalid number of users.\n");
        return 1;
    }
    initQueue(&q);
    if (enqueueUsers(&q, numUsers) != 0) {
        printf("Error: Could not enqueue users.\n");
        return 1;
    }
    while (!isQueueEmpty(&q)) {
        dequeue(&q, &user);
        printf("Username: %s, Level: %d, Faction: %s\n", user.username, user.level, user.faction);
    }
    return 0;
}

```

基于Monster 组和GPT的调写:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>


typedef struct {
    char username[11];
    int level;
    char faction[6];
} User;


typedef struct node {
    User data;
    struct node* next;
} Node;


typedef struct {
    Node* head;
    Node* tail;
} Queue;


void initQueue(Queue* q) {
    q->head = NULL;
    q->tail = NULL;
}

int isQueueEmpty(Queue* q) {
    return (q->head == NULL);
}


void enqueue(Queue* q, User data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    if (q->tail == NULL) {
        q->head = newNode;
    }
    else {
        q->tail->next = newNode;
    }
    q->tail = newNode;
}


void dequeue(Queue* q, User* data) {
    Node* temp;
    *data = q->head->data;
    temp = q->head;
    q->head = q->head->next;
    free(temp);
    if (q->head == NULL) {
        q->tail = NULL;
    }
}

void generateUser(User* user) {
    int i;
    char charset[][11] = { "abc1234561", "def2222222", "ghi3333333", "opq4444444", "rst5555555", "uvw6666666", "xyz7777777", "ABC1111111", "DEF1234567", "GHI0987654", "MyUsername1", "MyUsername2", "MyUsername3" };
    strcpy(user->username, charset[rand() % 10]);
    user->level = rand() % 60 + 1;
    switch (rand() % 3) {
    case 0:
        strcpy(user->faction, "red");
        break;
    case 1:
        strcpy(user->faction, "blue");
        break;
    case 2:
        strcpy(user->faction, "green");
        break;
    default:
        break;
    }
}




int enqueueUsers(Queue* q, int numUsers) {
    int i;
    User user;
    for (i = 0; i < numUsers; i++) {
        generateUser(&user);
        enqueue(q, user);
    }
    return -1; // 根据实际情况返回 -1 表示出错
}

int main(int argc, char* argv[]) {
    int numUsers = 10;
    User user;
    Queue q;
    srand(time(NULL));
    initQueue(&q);
    if (enqueueUsers(&q, numUsers) != -1) { // 判断是否出错
        printf("Error: Could not enqueue users.\n");
        return 1;
    }
    while (!isQueueEmpty(&q)) {
        dequeue(&q, &user);
        printf("Username: %s, Level: %d, Faction: %s\n", user.username, user.level, user.faction);
    }
    getchar(); // 在 Windows 系统下加入该语句以防止程序窗口立即关闭
    return 0;
}

把charset数组定义修改一下,修改如下:

char charset[][11] = { "abc1234561", "def2222222", "ghi3333333", "opq4444444", "rst5555555", "uvw6666666", "xyz7777777", "ABC1111111", "DEF1234567", "GHI0987654" };

明显的问题

generateUser函数
的下面这个
    
    char charset[] = {"abc1234561", "def2222222", "ghi3333333", "opq4444444", "rst5555555", "uvw6666666", "xyz7777777", "ABC1111111", "DEF1234567", "GHI0987654"};

一维数组被初始化为字符串数组了!!

……


参考GPT和自己的思路,原因是在初始化结构体的时候,使用了太多的初始化器值。

在 generateUser() 函数中,您使用了 charset 数组作为字符集,但是在声明时却把每个字符都放在了双引号中,这样每个字符都被视为一个字符串,会导致数组中有很多字符串。因此,当您使用这个数组时,应该把每个字符用单引号括起来,这样每个字符就被视为一个字符。

修改后的代码如下:

void generateUser(User* user) {
    int i;
    char charset[] = { 'a', 'b', 'c', '1', '2', '3', '4', '5', '6', '1', 'd', 'e', 'f', '2', '2', '2', '2', '2', '2', '2', 'g', 'h', 'i', '3', '3', '3', '3', '3', '3', '3', 'o', 'p', 'q', '4', '4', '4', '4', '4', '4', '4', 'r', 's', 't', '5', '5', '5', '5', '5', '5', '5', 'u', 'v', 'w', '6', '6', '6', '6', '6', '6', '6', 'x', 'y', 'z', '7', '7', '7', '7', '7', '7', '7', 'A', 'B', 'C', '1', '1', '1', '1', '1', '1', '1', 'D', 'E', 'F', '1', '2', '3', '4', '5', '6', '7', 'G', 'H', 'I', '0', '9', '8', '7', '6', '5', '4' };
    for (i = 0; i < 11; i++) {
        user->username[i] = charset[rand() % (sizeof(charset) - 1)];
    }
    user->username[10] = '\0';
    user->level = rand() % 60 + 1;
    switch (rand() % 3) {
    case 0:
        strcpy(user->faction, "red");
        break;
    case 1:
        strcpy(user->faction, "blue");
        break;
    case 2:
        strcpy(user->faction, "green");
        break;
    default:
        break;
    }
}
  1. 在enqueueUsers函数中,可能会出现内存泄漏的情况,因为在每次循环中都会创建新的User结构,然后使用enqueue函数将其加入队列,但是却没有释放该User结构所占用的内存空间。
  2. 在定义User结构时,faction数组的大小应该设置为7,而不是6,因为字符串中需要有结束符'\0'。

解决这个错误的方法是,确保变量的初始化器数量不超过定义时所指定的大小。如果需要初始化超过定义大小的变量,可以使用更大的数组或指针,或者使用循环和索引来逐个初始化数组元素。

修改如下,改动处见注释,供参考:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef struct {
    char username[11];
    int  level;
    char faction[6];
} User;

typedef struct node {
    User  data;
    struct node* next;
} Node;

typedef struct {
    Node* head;
    Node* tail;
} Queue;

void initQueue(Queue* q) {
    q->head = NULL;
    q->tail = NULL;
}

int isQueueEmpty(Queue* q) {
    return (q->head == NULL);
}

void enqueue(Queue* q, User data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    if (q->tail == NULL) {
        q->head = newNode;
    }
    else {
        q->tail->next = newNode;
    }
    q->tail = newNode;
}

void dequeue(Queue* q, User* data) {
    Node* temp;
    *data = q->head->data;
    temp = q->head;
    q->head = q->head->next;
    free(temp);
    if (q->head == NULL) {
        q->tail = NULL;
    }
}

void generateUser(User* user) {
    int i;
    char charset[][11] = { "abc1234561", "def2222222", "ghi3333333", "opq4444444", "rst5555555",   // 修改
                           "uvw6666666", "xyz7777777", "ABC1111111", "DEF1234567", "GHI0987654" };
    for (i = 0; i < 10; i++) {   //for (i = 0; i < 11; i++)                                        // 修改
        user->username[i] = charset[i][rand() % (sizeof(charset[i]) - 1)];
        // user->username[i] = charset[rand() % (sizeof(charset) - 1)];                            // 修改
    }
    user->username[10] = '\0';
    user->level = rand() % 60 + 1;
    switch (rand() % 3) {
    case 0:
        strcpy(user->faction, "red");
        break;
    case 1:
        strcpy(user->faction, "blue");
        break;
    case 2:
        strcpy(user->faction, "green");
        break;
    default:
        break;
    }
}

int enqueueUsers(Queue* q, int numUsers) {
    int i;
    User user;
    for (i = 0; i < numUsers; i++) {
        generateUser(&user);
        enqueue(q, user);
    }
    return 0;
}

// test main
int main(int argc, char* argv[]) 
{
    int numUsers;
    User user;
    Queue q;
    srand((unsigned int)time(NULL));  // 修改
    if (argc != 2) {
        printf("Usage: %s numUsers\n", argv[0]);
        return 1;
    }
    numUsers = atoi(argv[1]);
    if (numUsers <= 0) {
        printf("Invalid number of users.\n");
        return 1;
    }
    initQueue(&q);
    if (enqueueUsers(&q, numUsers) != 0) {
        printf("Error: Could not enqueue users.\n");
        return 1;
    }
    while (!isQueueEmpty(&q)) {
        dequeue(&q, &user);
        printf("Username: %s, Level: %d, Faction: %s\n", user.username, user.level, user.faction);
    }
    return 0;
}

仅供参考:
这个代码中出现了语法错误,错误信息是“太多的初始化器值”。这个错误通常出现在初始化数组或结构体时,提供的初始化器数量超过了声明时指定的数量。

在这个代码中,错误出现在了“charset”数组的声明上。这个数组应该是一个一维数组,但是在初始化时,使用了多个字符串常量来初始化数组,导致出现了太多的初始化器值。

要修复这个错误,可以将“charset”数组的初始化改为一个字符串常量,如下所示:

char charset[] = "abc1234561def2222222ghi3333333opq4444444rst5555555uvw6666666xyz7777777ABC1111111DEF1234567GHI0987654";

这样就可以消除“太多的初始化器值”的错误。


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>


typedef struct {
    char username[11];
    int level;
    char faction[6];
} User;


typedef struct node {
    User data;
    struct node* next;
} Node;


typedef struct {
    Node* head;
    Node* tail;
} Queue;


void initQueue(Queue* q) {
    q->head = NULL;
    q->tail = NULL;
}

int isQueueEmpty(Queue* q) {
    return (q->head == NULL);
}


void enqueue(Queue* q, User data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    if (q->tail == NULL) {
        q->head = newNode;
    }
    else {
        q->tail->next = newNode;
    }
    q->tail = newNode;
}


void dequeue(Queue* q, User* data) {
    Node* temp;
    *data = q->head->data;
    temp = q->head;
    q->head = q->head->next;
    free(temp);
    if (q->head == NULL) {
        q->tail = NULL;
    }
}

void generateUser(User* user) {
    //int i;    
    //数组的每个元素是const char*不是char
    const char* charset[] = { "abc1234561", "def2222222", "ghi3333333", "opq4444444", "rst5555555", "uvw6666666", "xyz7777777", "ABC1111111", "DEF1234567", "GHI0987654" };
    //for (i = 0; i < 11; i++) {
    //    user->username[i] = charset[rand() % (sizeof(charset) - 1)];
    //}
    //user->username[10] = '\0';
    //直接用字符串拷贝即可
    strcpy(user->username, charset[ rand() % (sizeof(charset)/sizeof(char*)) ]);
    user->level = rand() % 60 + 1;
    switch (rand() % 3) {
    case 0:
        strcpy(user->faction, "red");
        break;
    case 1:
        strcpy(user->faction, "blue");
        break;
    case 2:
        strcpy(user->faction, "green");
        break;
    default:
        break;
    }
}


int enqueueUsers(Queue* q, int numUsers) {
    int i;
    User user;
    for (i = 0; i < numUsers; i++) {
        generateUser(&user);
        enqueue(q, user);
    }
    return 0;
}

// test main
int main(int argc, char* argv[]) {
    int numUsers;
    User user;
    Queue q;
    srand(time(NULL));
    /*
    if (argc != 2) {
        printf("Usage: %s numUsers\n", argv[0]);
        return 1;
    }*/    
    //输入命令参数,则取命令参数的个数,没有输入则默认取20个
    numUsers = (argc>1)? atoi(argv[1]): 20;
    if (numUsers <= 0) {
        printf("Invalid number of users.\n");
        return 1;
    }
    initQueue(&q);
    if (enqueueUsers(&q, numUsers) != 0) {
        printf("Error: Could not enqueue users.\n");
        return 1;
    }
    while (!isQueueEmpty(&q)) {
        dequeue(&q, &user);
        printf("Username: %s, Level: %d, Faction: %s\n", user.username, user.level, user.faction);
    }
    return 0;
}