`
#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;
}
}
解决这个错误的方法是,确保变量的初始化器数量不超过定义时所指定的大小。如果需要初始化超过定义大小的变量,可以使用更大的数组或指针,或者使用循环和索引来逐个初始化数组元素。
修改如下,改动处见注释,供参考:
#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;
}