如何使用“\a”转义字符产生哔声?
Posted
技术标签:
【中文标题】如何使用“\\a”转义字符产生哔声?【英文标题】:How to produce beep sound using "\a" escape character?如何使用“\a”转义字符产生哔声? 【发布时间】:2010-10-02 12:06:28 【问题描述】:如果我写下面的程序,那么运行代码时没有哔声。
#include <stdio.h>
int main()
printf("\a");
return 0;
你能告诉我如何使用 C 程序使用 \a
来产生哔声吗?
【问题讨论】:
这取决于终端,这取决于您如何运行程序。如果 stdout 被重定向到文件,则在显示文件之前不会发出蜂鸣声。即便如此,并非所有终端在收到 ascii BEL 字符时都会发出蜂鸣声。如果可以的话,我会禁用它。对于工作中使用的机器,我通常会拔下 PC 内部扬声器的电缆,然后将其余的声音静音,除非我插入了耳机。祝你好运…… 最悲惨的哔哔声是来自笔记本电脑的哔哔声,它们通过“普通”扬声器发出令人难以置信的音量。 顺便说一句,您必须从终端运行程序,因为打印 '\a' 时发出哔哔声是终端功能(不是 C 或 OS 功能)。 @Lie Ryan 我也在终端尝试过,但没有哔声。我在终端上输入了以下命令 printf '\a' 但什么也没发生...... @Parixit:你的操作系统是什么,你使用什么终端程序? 【参考方案1】:您的程序唯一错误(一半错误)是main
签名。
要 100% 可移植,它应该是 int main(void)
或 int main(int argc, char **argv)
或等效项:int main()
不等效。
我也会打印一个'\n'
,或者刷新输出缓冲区,而不是依赖运行时自动为我刷新所有缓冲区,但是您的程序应该按原样响起。如果不是问题出在其他地方,而不是C
。
#include <stdio.h>
int main(void)
printf("\a\n");
return 0;
【讨论】:
你至少可以承认 C99 的存在,即使你认为提问者没有使用它;-) 即使在C99
中,int main()
也不等同于已发布的 2 个定义之一。
它在定义中。它不在其他声明中。 6.7.5.3/10 和 /14。它们都表示“无参数”,并且 5.1.2.2.1/1 指定 main
没有参数是可以的。它仅提供了两种方法中的一种作为示例代码,但我不认为这意味着暗示另一种方法是不可接受的。
我阅读标准的方式与您相同,但我的 C89 参考中的文本是相同的。我有一种“直觉”,我们在某个地方遗漏了一些东西……但我现在不想解释标准语。无论如何,无论如何,最好使用 2 个记录定义中的一个 :)
给定int main(void) /* ... */
递归调用main(42)
是违反约束的。鉴于int main() /* ... */
,它不是,尽管它确实有未定义的行为。我会说这使它们不等效。另一方面,如果int main() /* ... */
无效,那么就不可能编写在pre-ANSI 和ANSI C 中都有效的无参数主程序,我敢肯定这不是本意。在实践中,我从未听说过拒绝或以其他方式错误处理 int main()
的 C 编译器——但我仍然更喜欢 int main(void)
。【参考方案2】:
我通常使用另一种方法来获得在 Windows 7 上 100% 工作的哔声。
int x=7; //7 is beep sound other numbers may show emoji and characters
printf("%c",x);
【讨论】:
OP 询问的是 Linux,而不是 Windows。 Char 值 7 在 Scala 中的 Windows 10 上也可以作为蜂鸣器使用(不是主题本身,但很高兴注意到这个有趣的功能仍然支持 W10)。 @absoluteAquarian 抱怨 OP 询问有关 Linux 的问题,但我看不出在哪里指定,因此这篇文章可以作为一般讨论“打印”到控制台的哔哔声。 @GregoryFenn 请参阅 OP 问题中的 cmets。 “我使用的是 Ubuntu 10.04”【参考方案3】:我同意@Steve Jessop 的观点。人们会竭尽全力让计算机保持安静。
在 Windows 中:作为 "\a" 的替代方案,您可以使用 WinAPI 的 Beep 命令。如果您使用的是 Windows 7,这可能无法按预期工作。
Beep Function (Windows)
【讨论】:
【参考方案4】:如果您使用的是 Windows,则 Windows 版本发出蜂鸣声的方式非常不同。其中一些启用了该功能并且工作正常,但某些 Windows 版本没有。在某些窗口中,如果您有内部主板扬声器,它就可以工作。但是其他一些窗口,它可以在没有内部主板扬声器的情况下正常工作,直接来自声卡(那太好了!)。
如果你很幸运,并且使用适当的 windows 版本,beep/Beep/printf("\a") 将工作(在内部扬声器上(如果你有的话),或者最好通过声卡)。但是,如果您使用的是其他 Windows 版本,它将无法正常工作。如果在你的电脑上没问题,你朋友/家人的电脑会静音,他/她会认为你写了一个糟糕的程序:-D 但不是。
我的建议是,您应该使用音频库。它很简单,跨平台,并且始终可以在所有计算机等设备上运行。例如,Allegro_v4、Allegro_v5、SDL(简单 DirectMedia 层)或类似的东西。这些库可以很好地与 OpenGL/DirectX 配合使用,并且使用这些库,您可以加载图像、播放视频等。 Native OpenGL / GLUT / DirectX 不能做那样的事情。
【讨论】:
【参考方案5】:请列出您的操作系统、您是如何运行代码的以及您的计算机是否有蜂鸣器。
如果您使用 Windows,也许这个问答How to make a Beep sound in C on Windows? 会对您有所帮助。
如果您使用 GUI 桌面 Linux 发行版,终端仿真器(如 gnome-terminal 或 xfce4-terminal)有一个偏好选项 bell 可供检查。然后,确保您的扬声器正常工作。
下面的代码很适合我:
/* name: bell.c
* run: gcc bell.c && ./a.out
*/
#include <stdio.h>
int main(void)
printf("\a");
return 0;
顺便说一句,你的代码不是问题。
【讨论】:
【参考方案6】:#include<stdio.h>
#include<windows.h>
int main()
Beep(1000, 1000); /* you can use any number starting from 250, but make sure you use it both times
return 0;
【讨论】:
1.仅代码的答案很糟糕; 2. 他在 Linux 上; 3. 他明确地说“使用\a”以上是关于如何使用“\a”转义字符产生哔声?的主要内容,如果未能解决你的问题,请参考以下文章