消息被覆盖 - C
Messages being overwritten - C
我有以下两个函数,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);
}
您需要使用 strcpy
函数,而不是仅仅传递指针。当您编写 pq -> elements[i-pq -> front] = pq -> elements[i];
时,您只是在复制一个指针值。当您调用 scanf
函数并为其提供 element
的地址时,您将覆盖指针指向的数组。所有指向该数组的指针将指向被覆盖的字符数组。
为避免这种情况,使用 strcpy
函数将指针指向的数组的值复制到一个新数组,如下所示:
strcpy(pq -> elements[i-pq -> front], pq -> elements[i]);
//pq -> elements[i-pq -> front] = pq -> elements[i];
对每个在 sendMessage
和 receiveMessage
函数中从 elements
数组赋值的实例执行此操作。
同时修复下面代码中的分段错误。当 pq -> 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);
}
我有以下两个函数,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);
}
您需要使用 strcpy
函数,而不是仅仅传递指针。当您编写 pq -> elements[i-pq -> front] = pq -> elements[i];
时,您只是在复制一个指针值。当您调用 scanf
函数并为其提供 element
的地址时,您将覆盖指针指向的数组。所有指向该数组的指针将指向被覆盖的字符数组。
为避免这种情况,使用 strcpy
函数将指针指向的数组的值复制到一个新数组,如下所示:
strcpy(pq -> elements[i-pq -> front], pq -> elements[i]);
//pq -> elements[i-pq -> front] = pq -> elements[i];
对每个在 sendMessage
和 receiveMessage
函数中从 elements
数组赋值的实例执行此操作。
同时修复下面代码中的分段错误。当 pq -> 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);
}