【问题标题】:Messages being overwritten - C被覆盖的消息 - C
【发布时间】:2020-04-16 18:50:10
【问题描述】:

我有以下两个函数,SendMessage 和 ReceiveMessage,顾名思义,它们向队列发送消息并从队列接收消息。我的问题是,正在接收的每条消息都被最后输入的元素覆盖。例如 - 输入的消息是 a b c,输出的消息是 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);
}

【问题讨论】:

  • for(i = pq -&gt; front; i &lt;= pq -&gt; rear; i++) pq -&gt; elements[i-pq -&gt; front] = pq -&gt; elements[i]; 的目的是什么?我不明白你为什么要重新分配队列中的元素。假设它是一个循环队列,我希望sendMessage 将检查frontrear 以确定队列是否已满,如果没有,增加rear 并将新消息存储在那里,并且在每种情况下,检查rear 的环绕。
  • 我会尽量避免使用-1标记值,并尽可能使用无符号类型。
  • 请创建此队列的minimal, complete, and verifiable 示例。 queue 类在基本 C 语言中不存在。
  • 它仍然不是minimal reproducible example。请编辑代码以使其正确。
  • 这样更好吗@klutt

标签: c function message-queue


【解决方案1】:

您需要使用strcpy 函数,而不仅仅是传递指针。当您编写pq -&gt; elements[i-pq -&gt; front] = pq -&gt; elements[i]; 时,您只是在复制一个指针值。当您调用scanf 函数并为其提供element 的地址时,您将覆盖指针指向的数组。所有指向该数组的指针都将指向被覆盖的字符数组。

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

strcpy(pq -> elements[i-pq -> front], pq -> elements[i]);
            //pq -> elements[i-pq -> front] = pq -> elements[i];

对您在sendMessagereceiveMessage 函数中从elements 数组中分配值的每个实例执行此操作。

还可以在下面的代码中修复您的分段错误。当pq -&gt; front-1 时会发生什么?

void receiveMessage(queue *pq){
    char temp[MAX_MSG_LEN];

    //--> SEG FAULT <--//
    strcpy(temp, pq -> elements[pq -> front]);
    //--> SEG FAULT <--//

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

    printf("\nReceived message is %s\n", temp);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    相关资源
    最近更新 更多