You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Beep函数实现钢琴音效?我的C代码无声音输出求帮助

解决C代码无法通过Beep函数实现钢琴音效的问题

我帮你排查下代码里的问题,一步步来解决:

代码里的核心问题

  • Beep函数参数错误:Windows系统的Beep()函数需要两个参数,分别是频率(Hz)持续时长(毫秒)。你只传入了频率,而且tempo;这种写法没有任何实际作用,没有把时长参数传递给函数。
  • 缺少Windows API头文件Beep()是Windows专属的API函数,必须包含<windows.h>头文件,否则编译器无法识别这个函数,会导致编译失败或者运行时无法调用。
  • Switch语句无break导致分支贯穿:每个case后面都没有添加break;,这会导致程序执行完当前case的代码后,继续执行后续所有case的代码,比如输入'm'会触发所有音符的蜂鸣,这显然不符合预期。
  • (可选)输入缓冲区残留换行符:使用getchar()读取字符后,按下回车的换行符会留在输入缓冲区,如果后续有更多输入逻辑可能会出问题,我们可以额外处理这个问题。

修正后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>  // 必须包含这个头文件才能使用Beep函数

// 音符对应频率
// Dó: 261 Hz
// Ré: 293 Hz
// Mi: 329 Hz
// Fá: 349 Hz
// Sol: 392 Hz
// Lá: 440 Hz
// Si: 493 Hz
// Dó(2): 522 Hz
int main(){
    setlocale(LC_ALL,"Portuguese");
    char nota = ' ';
    const int tempo = 500;  // 把时长设为500毫秒,你可以根据需求调整
    const int som[8] = {261, 293, 329, 349, 392, 440, 493, 522};

    puts("### PIANO VIRTUAL ###");
    puts("m - Dó \na - Ré \nr - Mi \nc - Fá \ne - Sol \nl - Lá \nq - Si \nu - Dó*2");

    nota = getchar();
    // 处理输入缓冲区的换行符,避免后续输入出问题
    while(getchar() != '\n');

    switch (nota){
        case 'm': 
            Beep(som[0], tempo); 
            break;  // 每个case结束后加break,防止分支贯穿
        case 'a': 
            Beep(som[1], tempo); 
            break;
        case 'r': 
            Beep(som[2], tempo); 
            break;
        case 'c': 
            Beep(som[3], tempo); 
            break;
        case 'e': 
            Beep(som[4], tempo); 
            break;
        case 'l': 
            Beep(som[5], tempo); 
            break;
        case 'q': 
            Beep(som[6], tempo); 
            break;
        case 'u': 
            Beep(som[7], tempo); 
            break;
        default:  // 处理无效输入的情况
            puts("输入的音符无效,请重新运行程序输入正确的字符!");
            break;
    }
    return 0;
}

运行注意事项

  • 这段代码仅适用于Windows平台,因为Beep()是Windows专属API,Linux或macOS系统无法使用这个函数(可以用其他替代方案,但不在本次讨论范围内)。
  • 编译时需要使用支持Windows API的编译器,比如微软的MSVC,或者MinGW编译器。

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

火山引擎 最新活动