You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下C语言调用mpv后无法正常返回主菜单的问题

问题解决与代码修复

针对你遇到的两个问题,以下是具体原因和修复后的代码:

问题原因分析

  1. 输入选项后先显示菜单再执行命令:
    printf的输出默认是行缓冲机制,当输出内容未触发换行或缓冲区未满时,内容会暂存而非立即显示到终端。输入选择后缓冲区才被刷新,导致视觉上菜单先于命令执行显示;同时输入后的换行符残留在缓冲区,也会干扰后续输入输出流程。

  2. mpv播放结束后无法返回主菜单:
    mpv运行时会修改终端模式(比如禁用回显、切换到原始模式),若播放结束后终端状态未正确恢复,会导致程序输入输出异常,无法正常显示菜单和接收输入。

修复后的代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("\n\n\t\tListen to music on CLI\n\n\n");
    int choice;
    
    while(1)
    {
        // 打印菜单后强制刷新输出缓冲区,确保内容立即显示
        printf("1. Jazz\n");
        printf("2. Hip-Hop\n");
        printf("3. Pop\n");
        printf("4. Exit\n\n\n");
        printf("Enter your choice :  ");
        fflush(stdout);
        
        // 读取用户选择
        scanf("%d",&choice);
        
        // 清空输入缓冲区,移除残留的换行符
        while(getchar() != '\n');
        
        switch(choice)
        {
            case 1:
                system("mpv --no-video https://www.youtube.com/watch?v=GhAbBh3jwpg");
                // 恢复终端正常状态
                system("stty sane");
                break;
        
            case 2:
                system("mpv --no-video [你的Hip-Hop音频链接]");
                system("stty sane");
                break;
                
            case 3:
                system("mpv --no-video [你的Pop音频链接]");
                system("stty sane");
                break;
        
            case 4:
                printf("\n\n\t\t\tCoding is Fun !\n\n\n");
                exit(0);
        }
        // 分隔命令输出与下一次菜单
        printf("\n");
    }
    printf("\n\n\t\t\tCoding is Fun !\n\n\n");
    return 0;
}

关键修复点说明

  • 强制刷新输出缓冲区:调用fflush(stdout)确保菜单内容立即显示,避免缓冲导致的显示顺序混乱。
  • 清空输入缓冲区:用while(getchar() != '\n')丢弃输入后残留的换行符,防止后续输入被干扰。
  • 恢复终端状态:执行stty sane强制恢复终端正常模式,确保mpv播放结束后程序能正常交互。

内容的提问来源于stack exchange,提问作者error404

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:47:31