c++输出字符串问题

wawjsqj123 2018-12-16 02:15:11
一个队列问题:
在用参数传递了一个结构体之后要输出一个字符串,刚开始用的字符串数组,但是输出后为乱码,后来改为了string类型,一运行到那里,直接就卡住了!
// 数据结构医院候诊排队系统.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "string"
#include "malloc.h"
#include "iostream"
#define ok 1
#define error 0
#define overflow -1
#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10

using namespace std;
typedef int elemtype;
typedef int status;

typedef struct{
string name;
int age;
int level;//分one,two,three,four四个等级,等级越高优先级越高
}patient,*patientt;

typedef struct node
{
patientt data; //结点数据
//【负责建立队列各结点之间的联系,前一个结点的next指向后一个结点,形成链式队列】
struct node *next; //后继结点
}lqnode;

typedef struct
{
lqnode *front; //链式队列的队头指针,总是指向队列的头结点(出队一次,第二个结点变为头结点),为空!!
lqnode *rear; //链式队列的队尾指针,入队时指向新插入结点(总是指向队列的最后一个结点)
}linkqueue;

linkqueue one;//第一等级的队列!下面类似
linkqueue two;
linkqueue three;
linkqueue four;

//创建空队列
status initqueue(linkqueue *pqhead){
pqhead->front = pqhead->rear = (lqnode*)malloc(sizeof(lqnode));//队列头结点的队头和队尾指针申请内存
if (!pqhead->front) //检测是否申请失败
{
printf("申请空间失败!!!\n");
return error;
}
pqhead->front->next = NULL;
return ok;
}

//销毁队列
void destroyqueue(linkqueue *qphead){
free(qphead->front);
free(qphead->rear);
qphead->front = qphead->rear = NULL;
}
//清空队列
void clearqueue(linkqueue *pqhead){
pqhead->front = pqhead->rear;
pqhead->front->next = NULL;
pqhead->rear->next = NULL;
}
//判断队列是否为空
status isempityqueue(linkqueue *pqhead){
if (pqhead->front == pqhead->rear){
return ok;
}
return error;
}
//获得队列长度
int getqueuelen(linkqueue *pqhead){
lqnode *head = pqhead->front;
int lenth = 0;
while (head != pqhead->rear){
++lenth;
head = head->next;
}
return lenth;
}
//新元素入队 [先进先出原则:在队尾的位置插入] element-要插入元素
status enqueue(linkqueue *pqhead, patientt element){
lqnode *temp = (lqnode*)malloc(sizeof(lqnode));
if (!temp) //检测是否申请失败
{
printf("申请空间失败!!!\n");
return error;
}
temp->data = element;
temp->next = NULL;
pqhead->rear->next = temp;
pqhead->rear = temp;
return ok;
}
//新元素出队,同时保存出队的元素 [先进先出原则:在队头的位置删除]
status dequeue(linkqueue *pqhead){
if (isempityqueue(pqhead)){
cout << "该等级没有病人!";
return error;
}
lqnode *temp = pqhead->front->next; //初始化temp为要出队的结点的指针
cout << "病人" << temp->data->name << endl << "开始看病了";
if (pqhead->front->next == pqhead->rear){
pqhead->rear = pqhead->front;
}
pqhead->front->next = temp->next;

free(temp);
temp = NULL;
return ok;
}
//遍历队列
void queuetraverse(linkqueue *pqhead){
if (isempityqueue(pqhead)){
cout << "已经没有该等级的病人!";
return;
}
int i = getqueuelen(pqhead);
cout << "该等级还有" << i << "位病人!";
lqnode *temp = pqhead->front;
cout << "他们分别是:";
while (temp != pqhead->rear){
temp = temp->next;
cout << "姓名" << " " << temp->data->name << "\n";
cout << "年龄" << " " << temp->data->age << "\n";
cout << "等级" << " " << temp->data->level << "\n";
}
cout << "\n";
}

void line(){
int a, b, c;
patient data;
cout << "医院新来人数为:";
cin >> a;
for (int i = 0; i < a; i++){
cout << "请输入第" << i + 1 << "位的信息\n";
cout << "姓名:";
cin >> data.name;
cout << "年龄:";
cin >> data.age;
while (1){
cout << "等级:";
cin >> data.level;
if (data.level >= 1 && data.level <= 4){
break;
}
else{
cout << "输入错误,请重输!";
continue;
}
}
if (data.level == 1)
enqueue(&one,&data);
if (data.level == 2)
enqueue(&two, &data);
if (data.level == 3)
enqueue(&three, &data);
if (data.level == 4)
enqueue(&four, &data);
}
}
void diagnosis(){
int a, b, i, j;
cout << "医院现在空闲医生有:";
cin >> a;
for (i = 0; i < a; ){
if (!isempityqueue(&four)){
i++;
dequeue(&four);
continue;
}
if (!isempityqueue(&three)){
i++;
dequeue(&three);
continue;
}
if (!isempityqueue(&two)){
i++;
dequeue(&two);
continue;
}
if (!isempityqueue(&one)){
i++;
dequeue(&one);
continue;
}
if (isempityqueue(&one) && isempityqueue(&two) && isempityqueue(&three) && isempityqueue(&four)){
cout << "排队病人已经全部看完!" << "还剩下" << a - i << "位医生!";
break;
}
}
if (i == a){
cout << "one等级病人:";
queuetraverse(&one);
cout << "two等级病人:";
queuetraverse(&two);
cout << "three等级病人:";
queuetraverse(&three);
cout << "four等级病人:";
queuetraverse(&four);
}
}




int _tmain(int argc, _TCHAR* argv[])
{
//队列初始化
initqueue(&one);
initqueue(&two);
initqueue(&three);
initqueue(&four);
int choice;
do{
system("cls");
printf("------------------\n");
printf(" 欢迎进入\n");
printf("中北大学校医院排队候诊系统\n");
printf("-*-*-*-*-*-*-*-*-*\n");
printf("(1)---医院开门,病人到来\n");
printf("(2)---医生开始诊治病人\n");
printf("(0)---退出系统\n");
printf("-*-*-*-*-*-*-*-*-*\n");
printf("请输入您的选择[0-2]:");
cin >> choice;
printf("\n");
switch (choice)
{
case 1:
line();
break;
case 2:
diagnosis();
break;
case 0:
exit(0);
default:printf("无效的选项。\n");
}
printf("\n");
system("pause");
} while (choice != '0');

return 0;
}


该代码使用的是vs2013
代码第107行为问题出现地方,使用string类型,会程序终止,使用数组则输出乱码!
拜托路过的大佬帮忙看一下!!!多谢多谢
...全文
381 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wawjsqj123 2018-12-18
  • 打赏
  • 举报
回复
引用 1 楼 zjq9931的回复:
改成这样试试:

cout << "病人" << temp->data->name.c_str() << endl << "开始看病了";
我已经找到问题了,是因为整个结构就没有传递过去,所以不管怎么改,都没有办法输出
  • 打赏
  • 举报
回复
改成这样试试:

cout << "病人" << temp->data->name.c_str() << endl << "开始看病了";

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧