【发布时间】:2020-01-29 14:40:45
【问题描述】:
我正在尝试在 connect 4 游戏中更改我的 printf 语句的颜色输出。我已经做了一个功能来设置打印颜色并重置它。它适用于我的大部分代码,但不适用于第一次调用的第一个函数,但从那里开始工作。有问题的函数是主程序中调用的第一个函数。
我尝试了函数的不同定位,将其定位在调用函数的任一侧并将颜色代码直接输入到 printf 函数中,但它总是第一次失败(而且只是第一次)。
#include <stdio.h>
void sprint_green();
void sprint_red();
int main_menu ( void ){
int a = 0;
char opt [20];
sprint_red();
printf("============================\n");
printf(" Welcome to Connect4!\n");
printf("============================\n");
sprint_reset();
// Continue asking for an option until a valid option (n/l/q) is entered
while (a == 0)
{
sprint_green();
printf("(N)ew game\n(L)oad game\n(Q)uit");
sprint_reset();
fgets(opt, 20, stdin);
// if 'n', return 1
if(opt[0] == 'n' || opt[0] == 'N'){
a = 1;
}
// if 'l', return 2
else if(opt[0] == 'l' || opt[0] == 'L'){
a = 2;
}
// if 'q', return -1
else if(opt[0] == 'q' || opt[0] == 'Q'){
a = -1;
printf("\nGoodbye!\n");
}
// if anything else, give error message and ask again..
else
{
printf("Invalid option\n");
}
}
system("cls");
return(a);
}
int main (void)
{
int i;
for(i = 0; i < 5; i++)
{
main_menu();
}
}
void sprint_green()
{
printf("\033[1;32m");
}
void sprint_red()
{
printf("\033[1;31m");
}
void sprint_reset()
{
printf("\033[0m");
}
前三个 printf 语句应以红色打印,下一个将以绿色打印。然而第一次它被称为打印ANSI颜色代码。
[1;31m============================
Welcome to Connect4!
============================
[0m[1;32m(N)ew game
(L)oad game
(Q)uit[0m
但是,在运行一次游戏并重新启动(不关闭终端)后,这些功能可以正常工作。
【问题讨论】:
-
代码无法编译,因为它的某些部分丢失了。请删除所有不需要证明您的问题的部分,即创建minimal reproducible example。
-
\ 是 C 字符串中的保留字符。要将其包含在字符串中,您需要在其前面加上另一个 \,因此
printf("\\e[1;31m%c\\e[0m", print); -
@user694733 感谢您的反馈。我现在已经将它编辑为一个可编译的版本,它重现了同样的错误。
-
修复代码后(添加
#include <stdlib.h>并转发声明sprint_reset())我得到了正确的结果。也许在程序开始时运行cls? -
在 Linux 上它可以工作,除了不存在的
cls。在 Windowscmd窗口中,在执行cls之前,转义字符被打印为可见字符,之后转义序列被正确处理。在 Windows Mingw64 shell 窗口中,我看到一个缓冲问题,cls似乎不起作用。程序退出时出现输出,但所有颜色都正确。非便携式cls不起作用。使用_IONBF添加setvbuf调用后,输出立即出现。显然结果取决于终端的类型,cmd窗口在cls之后表现不同。