用C语言生成Ascii艺术文本
我试图生成一个有趣的应用程序ascii艺术文本。从FIGLET,我得到了ASCII模式。我在用C语言生成Ascii艺术文本,c,ascii-art,C,Ascii Art,我试图生成一个有趣的应用程序ascii艺术文本。从FIGLET,我得到了ASCII模式。我在printf语句中使用该模式来打印字母。以下是我从FIGLET获得的模式截图: 以下是我用来打印的代码片段: printf(" _/_/\n _/ _/\n _/_/_/_/\n _/ _/\n_/ _/\n"); 现在,我从用户那里获取一个输入文本,并以ASCII艺术形式显示它。由于我使用printf,我只能垂直生成它: 但我需要做水平艺术。怎么做?是的,这是一个
printf
语句中使用该模式来打印字母。以下是我从FIGLET获得的模式截图:
以下是我用来打印的代码片段:
printf(" _/_/\n _/ _/\n _/_/_/_/\n _/ _/\n_/ _/\n");
现在,我从用户那里获取一个输入文本,并以ASCII艺术形式显示它。由于我使用printf,我只能垂直生成它:
但我需要做水平艺术。怎么做?是的,这是一个众所周知的问题。我上一次解决这个问题是为每一行使用一个数组,并分别渲染每个字母 首先,我将表示数组中的每个字母。例如,你的A应该是这样的:
char* letter[8];
letter[0] = " _/_/ ";
letter[1] = " _/ _/";
etc.
(实际上,如果每个字母位于不同的索引,则将使用2D数组。)
实际渲染也将在数组中,大致如下:
char*render[8]
然后使用连接来构建每一行。简单嵌套的for循环应该可以实现以下功能:
for each line, i to render (i.e the height of the letters)
for each letter, j
concatenate line i of letter j to the to char* i in the array
最后循环遍历数组并打印每一行。实际上,您可以跳过渲染数组,只需打印每一行而无需回车。我想到了以下几点:
for each line, i to render : // (i.e the height of the letters)
for each letter, j {
output line i of letter j
}
output a carriage return
}
(我的C有点生疏,从这里可以看出“伪”代码。但是,我认为我的逻辑是正确的。)与其一次打印一个完整的字符作为一个字符串,不如将字符分成多个字符串——组成字符的每行文本对应一个字符串。然后打印每个字符的第一行、换行符,然后打印每个字符的第二行,等等。您需要在这些行中填充空格,以确保它们的宽度都正确。很高兴看到您喜欢Figlet。您显示的Figlet小部件实际上包含一个生成ASCII输出的命令行工具。 它也可以轻松地与brew一起安装
您可以通过
popen(..)
或类似的方法从自己的程序中轻松捕获其输出。您可以尝试以下方法:
注意:很明显,下面的内容在很多方面都有所欠缺,比如内存取消分配、错误检查、代码不完整等等。我们的想法是给你一个提示
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define ROW 4
#define COL 8
#define CHAR_INDEX_MAX 26
enum alph_enum {A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z};
typedef struct _alphabets {
char *line[ROW];
}alphabet;
alphabet chars[26];
init_a(enum alph_enum letter)
{
int i;
for (i=0 ; i<ROW ; i++) {
chars[letter].line[i] = (char *) malloc(COL);
if (chars[letter].line[i] == NULL) {
printf("memory allocation failed \n");
return;
}
}
switch (letter) {
/*0123 4567*/
case H:
strcpy(chars[letter].line[0], "| |");
strcpy(chars[letter].line[1], "|_______|");
strcpy(chars[letter].line[2], "| |");
strcpy(chars[letter].line[3], "| |");
break;
case E:
strcpy(chars[letter].line[0], "|-------");
strcpy(chars[letter].line[1], "|_______");
strcpy(chars[letter].line[2], "| ");
strcpy(chars[letter].line[3], "|_______");
break;
case L:
strcpy(chars[letter].line[0], "| ");
strcpy(chars[letter].line[1], "| ");
strcpy(chars[letter].line[2], "| ");
strcpy(chars[letter].line[3], "|_______");
break;
/* for all the other alphabets */
}
return;
}
print_str(char word[])
{
int i, j;
printf("\n");
for (i=0; i<ROW; i++) {
for (j=0 ; j<strlen(word) ; j++) {
printf("%s", chars[word[j] % 'A'].line[i]);
}
printf("\n");
}
printf("\n");
return;
}
int main(void)
{
init_a(H);
init_a(E);
init_a(L);
/* print_str("HELLO"); */
print_str("HELL");
return 0;
/* free the memory for HEL here */
}
待办事项:
- 您可以包括数字、特殊字符(如!、@、#、$等)、空格,可能所有ASCII字符都有意义
- 您可以支持字符的粗体、斜体、下划线和高亮显示
- 您可以支持前景色和背景色
- 您可以支持动画
希望这有帮助 (另一方面,以上述内容为基础,您实际上可以构建ascii艺术字体文件,并根据需要将其加载到数组中。)使用2D数组完成此操作。。。但是在空间填充方面面临一些问题。。希望我能很快解决…谢谢,让我试试。。我想Jaco Van也说过类似的想法。
> gcc test.c -o print
> print
| ||-------| |
|_______||_______| |
| || | |
| ||_______|_______|_______
>