2011-12-21 2 views
5

재미있는 응용 프로그램을 위해 ascii art text를 생성하려고합니다. FIGLET에서 ASCII 패턴을 얻었습니다. 문자를 인쇄하려면 printf 문에서 해당 패턴을 사용하고 있습니다. 여기C에서 Ascii 아트 텍스트 생성

FIGLET

내가 인쇄하는 데 사용하는 코드입니다 : : 여기 FIGLET에서 가져온 패턴의 스크린 샷은 지금

printf("  _/_/\n _/ _/\n _/_/_/_/\n _/ _/\n_/ _/\n"); 

을, 나는 사용자로부터 입력 텍스트를 가지고 가고, ASCII 아트로 보여주세요. 내가의 printf를 사용할 때, 나는 단지 수직으로 생성 할 수 있습니다

Vertical image

하지만 수평 ASCII 아트를 할 필요가있다. 그렇게하는 방법 ?

답변

2

예, 잘 알려진 문제입니다. 마지막으로이 문제를 해결하기 위해 각 행에 대해 배열을 사용하고 각 문자를 개별적으로 렌더링합니다.

첫째, 배열의 각 문자를 나타냅니다. 예를 들어 사용자 A가이 같은 것입니다 : (. 각 문자는 다른 인덱스입니다 사실은 2 차원 배열이 사용되는)

char* letter[8]; 
letter[0] = "  _/_/ "; 
letter[1] = " _/ _/"; 
etc. 

실제뿐만 아니라 배열에있을 것입니다 렌더링, 라인을 따라 뭔가 :

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 
} 

+0

(위의 내용을 기초로하여 아스키 아트 글꼴 파일을 빌드하고 필요에 따라 배열에로드 할 수 있습니다.) –

+0

감사합니다. 아이디어를 얻었습니다 ... 시도해 보겠습니다. ... – utsabiem

+0

2D 배열을 사용 했습니까?하지만 공간 패딩의 일부 문제에 직면했습니다 .. 잘하면 나중에 해결해 드리겠습니다. – utsabiem

1

대신 하나 개의 전체 인쇄 (.. 내 C는 거기에서 "의사"코드 그러나, 나는 내 논리가 소리라고 생각합니다, 약간 녹슨입니다) 한 번에 한 문자 씩 문자를 여러 문자열 (문자를 구성하는 각 텍스트 행마다 하나씩)로 나눕니다. 그런 다음 각 문자의 첫 줄, 개행 문자, 각 문자의 두 번째 줄 등을 인쇄하십시오. 줄이 모두 올바른 너비인지 확인하려면 줄을 채워야합니다.

1

당신이 그림을 좋아한다는 것을 알았습니다. 보여주는 그림 위젯에는 실제로 ASCII 출력을 생성하는 명령 행 도구가 포함되어 있습니다. http://www.figlet.org/ 브루 http://mxcl.github.com/homebrew/으로 쉽게 설치할 수 있습니다.

popen(..) 또는 그와 비슷한 것으로 자신의 프로그램에서 출력을 쉽게 캡처 할 수 있다고 생각하십시오.

참고 :

2

다음과 같은 것을 시도 할 수 물론, 다음 아이디어는 당신에게 힌트를 제공하는 것입니다 등 메모리 할당 해제, 오류 검사, 불완전 코드 같은 것들을 많이 부족 !

#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) { 
            /**/ 
    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 */ 
} 
다음과 같이 출력 될 것

:

> gcc test.c -o print 
> print 

|  ||-------|  | 
|_______||_______|  | 
|  ||  |  | 
|  ||_______|_______|_______ 

> 

TODO : 당신은 빈 숫자, 특수 문자 (!와 같은, @, #, $ 등)를 포함 할 수

  • 공백, 모든 ASCII 문자가 의미가있을 수 있습니다.
  • 당신은, 굵은 지원 이탤릭체는, 당신은 애니메이션이 도움이

희망을 지원할 수

  • 당신은 지원 전경색과 배경색 수있는 문자
  • 을 위해 밑줄 강조!

  • +0

    감사합니다. 시도해 보겠습니다. Jaco Van이 비슷한 아이디어에 대해 이야기했다고 생각합니다. – utsabiem