我正在尝试用 C 语言制作一个简单的“彩色文本”程序,它使用 windows.h 来更改终端颜色(命令行程序)并使用 tcc 进行编译。然而,它并没有像它应该的那样工作,而是根据给定的文本(甚至控制字符!)选择随机颜色,而不是实际上只是通常传递数字。我该如何解决这个问题?
#include <stdio.h>
#include <windows.h>
int main(int argc, char *argv[]) {
if (argc >= 3) {
printf("Too many arguments specified.");
return 1;
}
if (argc == 1) {
printf("No arguments specified. Please specify one.");
return 1;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), *argv[1]);
return 0;
}
所以,如果我输入 0(这应该让我看到全黑文本),我会得到这个:
编辑:看起来将 *argv[1]
更改为 strlen(argv[1]);
有效。但是,现在它取决于指定输入的长度,而不是给定的数字。它至少正确地设置了背景和前景(长度为 0 会产生错误,长度为 1 会将其更改为 1,长度为任意值将其设置为任意值等),并使用“anti strlen”(采用数字,并创建一个包含多个字母的数字字符串,然后返回它)不起作用。
编辑:使用atoi();解决了我的问题:
#include <windows.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), atoi(argv[1]));
return 0;
};
最佳答案
您正在获得您指定的颜色。
原因如下:“.. 而不是实际上通常只是传递数字...”,但是 argv[1]
确实不“传递数字”!程序参数总是作为字符串传递。
SetConsoleTextAttribute
将控制台字符颜色设置为提供的值。 character attributes由位定义,但该 MSDN 页面仅列出了它们的符号名称。查看 wincon.h
显示了它们的实际分配:
#define FOREGROUND_BLUE 1
#define FOREGROUND_GREEN 2
#define FOREGROUND_RED 4
#define FOREGROUND_INTENSITY 8
#define BACKGROUND_BLUE 16
#define BACKGROUND_GREEN 32
#define BACKGROUND_RED 64
#define BACKGROUND_INTENSITY 128
那么您发送了什么值?字符串 "0"
的第一个字符 - 即十进制代码 48
或十六进制 0x30
。这 – 查看定义 – 归结为 BACKGROUND_BLUE + Behind_GREEN
= 青色。
有趣的是,由于您想要黑底黑字,因此没有明显的方法来输入二进制 0
作为命令参数。我建议您以十进制或十六进制表示法输入所需的颜色代码,而不是作为“原始”值,并使用 strtol
或类似函数将其转换为二进制值。
关于Colortext 程序无法正确着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41919652/