Linux下C语言调用mpv后无法正常返回主菜单的问题
问题解决与代码修复
针对你遇到的两个问题,以下是具体原因和修复后的代码:
问题原因分析
输入选项后先显示菜单再执行命令:
printf的输出默认是行缓冲机制,当输出内容未触发换行或缓冲区未满时,内容会暂存而非立即显示到终端。输入选择后缓冲区才被刷新,导致视觉上菜单先于命令执行显示;同时输入后的换行符残留在缓冲区,也会干扰后续输入输出流程。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
相关产品推荐
相关产品推荐

