You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言控制台中为封禁客户端打印红色至最后分隔线

解决C语言控制台中Blocked客户端信息全红打印的问题

核心问题分析

你当前的代码应该是在打印到某一行(比如Date of reg:)后就直接恢复了默认颜色,没有持续跟踪"blocked"区间直到最后一条分隔线。要解决这个问题,关键是用一个状态变量来标记是否处于需要红色打印的区间,直到遇到结束分隔线再关闭红色。

解决方案步骤

  1. 控制台颜色控制基础

    • Windows平台:使用SetConsoleTextAttribute函数(需包含windows.h),红色对应FOREGROUND_RED,默认颜色对应FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE。
    • Linux/macOS平台:使用ANSI转义序列,红色是\033[31m,恢复默认是\033[0m。
  2. 核心逻辑实现
    定义一个状态变量(比如int is_blocked = 0;),逐行读取文件内容时:

    • 当读到包含BLOCKED的行:开启红色打印,设置is_blocked = 1,然后打印该行。
    • 当读到分隔线(注意匹配你文件中实际的分隔线字符串,比如"————————————————"):先按当前颜色打印该行,然后关闭红色,设置is_blocked = 0。
    • 其他行:根据is_blocked的状态选择颜色打印。

代码示例

Windows平台版本

#include <stdio.h>
#include <windows.h>
#include <string.h>

#define SEPARATOR "————————————————" // 替换成你文件中实际的分隔线

int main() {
    FILE *fp = fopen("clients.txt", "r");
    if (!fp) {
        perror("Failed to open file");
        return 1;
    }

    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    int is_blocked = 0;
    char line[256];

    while (fgets(line, sizeof(line), fp) != NULL) {
        // 去掉换行符
        line[strcspn(line, "\n")] = '\0';

        // 判断是否进入blocked区间
        if (strstr(line, "BLOCKED") != NULL) {
            is_blocked = 1;
            SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
        }

        // 打印当前行
        printf("%s\n", line);

        // 判断是否是结束分隔线,退出blocked区间
        if (strcmp(line, SEPARATOR) == 0 && is_blocked) {
            is_blocked = 0;
            SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
        }
    }

    fclose(fp);
    return 0;
}

Linux/macOS平台版本

#include <stdio.h>
#include <string.h>

#define SEPARATOR "————————————————" // 替换成你文件中实际的分隔线

int main() {
    FILE *fp = fopen("clients.txt", "r");
    if (!fp) {
        perror("Failed to open file");
        return 1;
    }

    int is_blocked = 0;
    char line[256];

    while (fgets(line, sizeof(line), fp) != NULL) {
        // 去掉换行符
        line[strcspn(line, "\n")] = '\0';

        // 判断是否进入blocked区间
        if (strstr(line, "BLOCKED") != NULL) {
            is_blocked = 1;
            printf("\033[31m"); // 开启红色
        }

        // 打印当前行
        printf("%s\n", line);

        // 判断是否是结束分隔线,退出blocked区间
        if (strcmp(line, SEPARATOR) == 0 && is_blocked) {
            is_blocked = 0;
            printf("\033[0m"); // 恢复默认颜色
        }
    }

    fclose(fp);
    return 0;
}

关键注意事项

  • 确保分隔线字符串SEPARATOR完全匹配你文件中的实际分隔线(包括长度、符号类型,别把短横线-和长横线—搞混)。
  • 状态变量is_blocked要全程跟踪,不要在中间行(比如Date of reg:)就重置,必须等到分隔线才关闭红色。
  • 如果你的客户端信息块是多个,每个blocked块都能被正确识别,因为每次遇到分隔线都会重置状态。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:12:30