Colortext 程序无法正确着色

标签 c colors parameter-passing command-line-arguments argv

我正在尝试用 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(这应该让我看到全黑文本),我会得到这个:

not expected, should just make it black

编辑:看起来将 *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;
};

enter image description here

最佳答案

正在获得您指定的颜色。

原因如下:“.. 而不是实际上通常只是传递数字...”,但是 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/

相关文章:

c - 将数组作为参数传递给 C 中的函数

c - ANSI C 中的 getopt()

c - 使用 Plecs 的 C 语言状态机

将字符串复制到字符串数组中

C题: If I pass the address of a variable to a function that modifies it is there a guarantee that the variable will be "reloaded" after return?

jquery改变表格单元格颜色

android - 在 Android 中通过 CODE ONLY 更改进度条颜色

css - 如何更改 Disqus 评论文本区域中的文本颜色?

c - 自制内核中的三重故障

powershell - 使用参数测量启动进程的运行时间