一些c语言特殊用法
C语言一些高级输出技巧与数组初始化
控制台颜色输出
完整颜色定义头文件
创建 colors.h 头文件:
#ifndef COLORS_H
#define COLORS_H
// 重置所有属性
#define RESET "\033[0m"
// 常规前景色
#define BLACK "\033[30m"
#define RED "\033[31m"
#define GREEN "\033[32m"
#define YELLOW "\033[33m"
#define BLUE "\033[34m"
#define MAGENTA "\033[35m"
#define CYAN "\033[36m"
#define WHITE "\033[37m"
// 亮色前景色
#define BRIGHT_BLACK "\033[90m"
#define BRIGHT_RED "\033[91m"
#define BRIGHT_GREEN "\033[92m"
#define BRIGHT_YELLOW "\033[93m"
#define BRIGHT_BLUE "\033[94m"
#define BRIGHT_MAGENTA "\033[95m"
#define BRIGHT_CYAN "\033[96m"
#define BRIGHT_WHITE "\033[97m"
// 常规背景色
#define BG_BLACK "\033[40m"
#define BG_RED "\033[41m"
#define BG_GREEN "\033[42m"
#define BG_YELLOW "\033[43m"
#define BG_BLUE "\033[44m"
#define BG_MAGENTA "\033[45m"
#define BG_CYAN "\033[46m"
#define BG_WHITE "\033[47m"
// 亮色背景色
#define BG_BRIGHT_BLACK "\033[100m"
#define BG_BRIGHT_RED "\033[101m"
#define BG_BRIGHT_GREEN "\033[102m"
#define BG_BRIGHT_YELLOW "\033[103m"
#define BG_BRIGHT_BLUE "\033[104m"
#define BG_BRIGHT_MAGENTA "\033[105m"
#define BG_BRIGHT_CYAN "\033[106m"
#define BG_BRIGHT_WHITE "\033[107m"
// 文本样式
#define BOLD "\033[1m"
#define DIM "\033[2m"
#define ITALIC "\033[3m"
#define UNDERLINE "\033[4m"
#define BLINK "\033[5m"
#define REVERSE "\033[7m"
#define HIDDEN "\033[8m"
#define STRIKE "\033[9m"
#endif
int main() {
// 前景色示例
printf(RED "这是红色文本" RESET "\n");
printf(GREEN "这是绿色文本" RESET "\n");
printf(YELLOW "这是黄色文本" RESET "\n");
printf(BLUE "这是蓝色文本" RESET "\n");
printf(MAGENTA "这是洋红色文本" RESET "\n");
printf(CYAN "这是青色文本" RESET "\n");
printf(WHITE "这是白色文本" RESET "\n");
printf("\n");
// 背景色示例
printf(BG_RED "这是红色背景" RESET "\n");
printf(BG_GREEN "这是绿色背景" RESET "\n");
printf(BG_YELLOW "这是黄色背景" RESET "\n");
printf(BG_BLUE "这是蓝色背景" RESET "\n");
printf(BG_MAGENTA "这是洋红色背景" RESET "\n");
printf(BG_CYAN "这是青色背景" RESET "\n");
printf(BG_WHITE "这是白色背景" RESET "\n");
printf("\n");
// 组合前景和背景色
printf(RED BG_WHITE "红字白底" RESET "\n");
printf(BLUE BG_YELLOW "蓝字黄底" RESET "\n");
printf(WHITE BG_RED "白字红底" RESET "\n");
return 0;
}
重复刷新一行的输出技巧
要在同一行中不断闪现随机名字,需要用到一个特殊字符:‘\r’它的作用,是将光标移动到行首,但不换行,此时如果输出信息,那么这些信息就会覆盖原有的内容。重复这个过程,妥善处理一行内容长短不一的问题,就可以在同一样中不断闪现不同的名字。
动态进度显示
#include <stdio.h>
#include <unistd.h> // sleep函数
#include <string.h>
// 动态加载动画
void loading_animation(const char* message, int duration_sec) {
const char* frames[] = {"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"};
int frame_count = sizeof(frames) / sizeof(frames[0]);
for (int i = 0; i < duration_sec * 10; i++) {
printf("\r%s %s %s", frames[i % frame_count], message,
i % 20 < 10 ? "|" : " ");
fflush(stdout);
usleep(100000); // 100ms
}
printf("\r✓ %s 完成!\n", message);
}
// 倒计时显示
void countdown(int seconds) {
for (int i = seconds; i > 0; i--) {
printf("\r倒计时: " RED "%d" RESET " 秒", i);
fflush(stdout);
sleep(1);
}
printf("\r" GREEN "开始执行! \n" RESET);
}
// 实时数据更新
void real_time_display() {
int values[] = {23, 45, 67, 89, 12, 34, 56, 78, 90};
int count = sizeof(values) / sizeof(values[0]);
for (int i = 0; i < 20; i++) {
int index = i % count;
printf("\r当前数值: " CYAN "%3d" RESET " | 进度: [", values[index]);
// 动态进度条
for (int j = 0; j < 20; j++) {
if (j <= i % 20) {
printf(BRIGHT_GREEN "█");
} else {
printf(DIM "░");
}
}
printf(RESET "]");
fflush(stdout);
usleep(200000); // 200ms
}
printf("\n");
}
int main() {
printf("=== 动态刷新演示 ===\n");
loading_animation("正在加载数据", 3);
countdown(5);
real_time_display();
return 0;
}
使用头文件预处理初始化数组
文本文件数据
创建 NameList.txt:
"Alice",
"Bob",
"Charlie",
"David",
"Eve",
"Frank",
"Grace",
"Henry",
"Ivy",
"Jack"
创建 ConfigData.txt:
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
{10, 11, 12}
主程序使用
#include <stdio.h>
#include <stdlib.h>
// 方法1: 初始化字符串数组
char *Names[] = {
#include "NameList.txt"
NULL // 结束标记
};
// 方法2: 初始化二维数组
int Matrix[][3] = {
#include "ConfigData.txt"
};
// 方法3: 带条件的初始化
#ifdef DEBUG_MODE
char *LogLevels[] = {
"TRACE",
"DEBUG",
"INFO",
"WARN",
"ERROR",
"FATAL"
};
#else
char *LogLevels[] = {
"INFO",
"WARN",
"ERROR",
"FATAL"
};
#endif
// 计算数组元素个数
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
int main() {
// 显示名称列表
printf("=== 名称列表 ===\n");
for (int i = 0; Names[i] != NULL; i++) {
printf("%d: %s\n", i + 1, Names[i]);
}
// 显示矩阵数据
printf("\n=== 矩阵数据 ===\n");
int rows = ARRAY_SIZE(Matrix);
int cols = ARRAY_SIZE(Matrix[0]);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%3d ", Matrix[i][j]);
}
printf("\n");
}
// 显示日志级别
printf("\n=== 日志级别 ===\n");
for (int i = 0; i < ARRAY_SIZE(LogLevels); i++) {
printf("%s ", LogLevels[i]);
}
printf("\n");
return 0;
}

浙公网安备 33010602011771号