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