正在覆盖的消息-C

正在覆盖的消息-C,c,function,message-queue,C,Function,Message Queue,我有以下两个函数,SendMessage和ReceiveMessage,顾名思义,它们向队列发送消息,并从队列接收消息。我的问题是,接收到的每一条消息都被最后输入的元素重写了。例如,输入的消息是b c,输出的消息是c c typedef struct{ int front, rear; char* elements[MAX_MESSAGES]; }queue; int main(){ char choice; char element[MAX_MSG_LEN]

我有以下两个函数,SendMessage和ReceiveMessage,顾名思义,它们向队列发送消息,并从队列接收消息。我的问题是,接收到的每一条消息都被最后输入的元素重写了。例如,输入的消息是b c,输出的消息是c c

typedef struct{
    int front, rear;
    char* elements[MAX_MESSAGES];
}queue;


int main(){
    char choice;
    char element[MAX_MSG_LEN];

    queue q;
    create(&q);

    while(1){
        printf("\n1) Send Message");
        printf("\n2) Receive Message");
        printf("\n0) Quit");
        printf("\nEnter choice:");
        scanf(" %c", &choice);

        switch(choice)
        {
            case '1':              
                    printf("\nEnter message to send:");
                    scanf("%s", element);
                    sendMessage(&q, element);                
                break;
            case '2':
                    receiveMessage(&q);              
                break;              
            case '0':
                printf("\nQuitting");
                exit(1);
            default:
                printf("Incorrect. Re-enter.\n");
                break;
        }
    }
}

void create(queue *pq){
    pq -> front = pq->rear = -1;
}

void sendMessage(queue *pq, char element[MAX_MSG_LEN]){
    int i;

    if(pq -> front == -1)
        pq -> front = pq -> rear = 0;

    else if (pq -> rear == MAX_MESSAGES - 1){
        for(i = pq -> front; i <= pq -> rear; i++)
            pq -> elements[i-pq -> front] = pq -> elements[i];

        pq -> rear = pq -> rear + pq -> front -1;
        pq -> front = 0;
    }
    else pq -> rear++;

    pq -> elements[pq->rear] = element;
}

void receiveMessage(queue *pq){
    char* temp;

    temp = pq -> elements[pq -> front];

    if(pq -> front == pq -> rear)
        pq -> front = pq -> rear = -1;
    else
        pq -> front++;

    printf("\nReceived message is %s\n", temp);
}
typedef结构{
前,后;
字符*元素[最大消息];
}排队;
int main(){
字符选择;
字符元素[MAX_MSG_LEN];
队列q;
创建(&q);
而(1){
printf(“\n1)发送消息”);
printf(“\n2)接收消息”);
printf(“\n0)退出”);
printf(“\n输入选项:”);
scanf(“%c”,选择(&c));
开关(选择)
{
案例“1”:
printf(“\n输入要发送的消息:”);
scanf(“%s”,元素);
sendMessage(&q,元素);
打破
案例“2”:
接收消息(&q);
打破
案例“0”:
printf(“\n匹配”);
出口(1);
违约:
printf(“不正确。请重新输入。\n”);
打破
}
}
}
无效创建(队列*pq){
pq->front=pq->rear=-1;
}
void sendMessage(队列*pq,字符元素[MAX\u MSG\u LEN]){
int i;
如果(pq->前==-1)
pq->前部=pq->后部=0;
否则如果(pq->rear==最大消息-1){
用于(i=pq->前部;i后部;i++)
pq->元素[i-pq->front]=pq->元素[i];
pq->rear=pq->rear+pq->front-1;
pq->前端=0;
}
else pq->rear++;
pq->元件[pq->后]=元件;
}
无效接收消息(队列*pq){
字符*温度;
温度=pq->元件[pq->前];
如果(pq->前==pq->后)
pq->front=pq->rear=-1;
其他的
pq->front++;
printf(“\n收到的消息是%s\n”,temp);
}

您需要使用
strcpy
函数,而不仅仅是传递指针。当你写
pq->elements[i-pq->front]=pq->elements[i]您只是在复制指针值。调用
scanf
函数并为其指定
元素的地址时,您正在覆盖指针指向的数组。所有指向该数组的指针都将指向被覆盖的字符数组

要避免这种情况,请使用
strcpy
函数将指针指向的数组的值复制到如下新数组:

strcpy(pq->elements[i-pq->front],pq->elements[i]);
//pq->元素[i-pq->front]=pq->元素[i];
对于从
发送消息
接收消息
函数中的
元素
数组中指定值的每个实例,都要执行此操作

还可以修复下面代码中的分段错误。当
pq->front
-1
时会发生什么

void receiveMessage(队列*pq){
字符温度[MAX_MSG_LEN];
//-->SEG故障元件[pq->前];
//-->SEG故障前部==pq->后部)
pq->front=pq->rear=-1;
其他的
pq->front++;
printf(“\n收到的消息是%s\n”,temp);
}

对于(i=pq->front;i rear;i++)pq->elements[i-pq->front]=pq->elements[i]?我不明白你为什么要重新分配队列中的元素。假设它是一个循环队列,我希望
sendMessage
将检查
front
rear
以确定队列是否已满,如果未满,则递增
rear
并将新消息存储在那里,在每种情况下,正在检查
的环绕。我将尝试避免使用
-1
哨兵值,并尽可能多地使用未签名类型。请创建此队列的示例。基本C语言中不存在
队列
类。它仍然不是一个。请编辑代码使其正确。这样更好吗@klutt