如何在C语言控制台中为封禁客户端打印红色至最后分隔线
解决C语言控制台中Blocked客户端信息全红打印的问题
核心问题分析
你当前的代码应该是在打印到某一行(比如Date of reg:)后就直接恢复了默认颜色,没有持续跟踪"blocked"区间直到最后一条分隔线。要解决这个问题,关键是用一个状态变量来标记是否处于需要红色打印的区间,直到遇到结束分隔线再关闭红色。
解决方案步骤
控制台颜色控制基础
- Windows平台:使用
SetConsoleTextAttribute函数(需包含windows.h),红色对应FOREGROUND_RED,默认颜色对应FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE。 - Linux/macOS平台:使用ANSI转义序列,红色是
\033[31m,恢复默认是\033[0m。
- Windows平台:使用
核心逻辑实现
定义一个状态变量(比如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
相关产品推荐
相关产品推荐

