GhostSheep9 2022-03-28 15:29 采纳率: 33.3%
浏览 141

关于键盘输入缓冲区的问题!

问题遇到的现象和发生背景 遇到难题了!求解:

有两个进程同时存在于一个程序中。其中第一个进程不断检测输入的字符信息,如果输入不是’;’并且不是’,’时,就读入用户键入的字符并保存到输入缓冲区中。当用户输入’;’或’,’时,第一个进程结束,第二个进程从缓冲区中依次读取用户输入的字符,并显示在屏幕上。第二个进程结束后,程序又进入第一个进程,重新检测输入的字符信息,直到输入的字符信息是‘.’时,第二个进程结束。另外,当输入缓冲区满后,强行中止第一个进程,进入第二个进程。
输入的字符以空格分隔,例如:1 2 3 4 ,则输出1234
输入j i e s h u .
输出jieshu
第二个进程结束,整个程序结束执行。

问题相关代码,请勿粘贴截图
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define OVERFLOW -2
#define INFEASIBLE -1
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define MAXQSIZE 10

typedef char QElemType;
typedef struct SqQueue {
    QElemType *base;
    int front;
    int rear;
} SqQueue;

int InitQueue(SqQueue *Q) { // 构造一个空队列Q
    Q->base = (QElemType *) malloc(MAXQSIZE * sizeof(QElemType));
    if (!Q->base) // 存储分配失败
        exit(OVERFLOW);
    Q->front = Q->rear = 0;
    return OK;
}

int QueueEmpty(SqQueue Q) { // 若队列Q为空队列,则返回TRUE,否则返回FALSE
    if (Q.front == Q.rear) // 队列空的标志
        return TRUE;
    else
        return FALSE;
}
/*TODO:插入队列
功能说明:插入元素e为Q的新的队尾元素
参数说明:Q-SqQueue类型的结构体
e-QElemType类型的参数
返回值说明:OK:成功插入队列,ERROR:插入队列失败,队列满
*/
int EnQueue(SqQueue *Q, QElemType e) { // 插入元素e为Q的新的队尾元素

}

/*TODO:出队列
功能说明:若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
参数说明:Q-SqQueue类型的结构体
e-QElemType类型的参数
返回值说明:OK:出队成功,ERROR:出队失败
*/ 
int DeQueue(SqQueue *Q, QElemType *e) { // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR

}

void main() { //模拟键盘输入循环缓冲区
    char ch1, ch2;
    SqQueue Q;
    int f;
    InitQueue(&Q);
    for (;;) {
        printf("第1个进程等待输入!\n");
        //第1个进程
        for (;;) {
            scanf("%s", &ch1);
            if (ch1) {
                if (ch1 == ',' || ch1 == ';' || ch1 == '.')
                    break; //第1个进程正常中断
                f = EnQueue(&Q, ch1);
                //循环队列满时强制中断第1个进程
                if (f == ERROR) {
                    printf("循环队列已满!\n");
                    break;
                }
            }

        }
        printf("第2个进程,显示输入缓冲区的内容!\n");
        while (!QueueEmpty(Q)) //第2个进程
        {
            DeQueue(&Q, &ch2);
            putchar(ch2);  //显示输入缓冲区的内容

        }
        putchar('\n');
        if (ch1 == '.') {
            break;
        }
    }
}

运行结果及报错内容
我的解答思路和尝试过的方法 希望能提供一个简便的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-03-28 17:46
    关注

    多进程不用fork或CreateProcess?

    评论

报告相同问题?

问题事件

  • 创建了问题 3月28日

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。