सी

2011-12-21 2 views
5

में असीसी कला टेक्स्ट जेनरेट करें मैं एक मजेदार एप्लिकेशन के लिए एसीआईआई कला पाठ उत्पन्न करने की कोशिश कर रहा हूं। FIGLET से, मुझे ASCII पैटर्न मिला। मैं अक्षरों को मुद्रित करने के लिए printf कथन में उस पैटर्न का उपयोग कर रहा हूं।सी

FIGLET

यहाँ कोड का टुकड़ा मैं एक मुद्रित करने के लिए का उपयोग किया जाता है:: यहाँ पैटर्न मैं FIGLET से मिल गया का एक स्क्रीनशॉट है अब

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

, मुझे प्रयोक्ता की ओर एक इनपुट पाठ लेते हैं, और इसे ASCII कला में दिखाएं। मैं printf का उपयोग के रूप में, मैं केवल यह खड़ी उत्पन्न कर सकते हैं:

Vertical image

लेकिन मैं क्षैतिज ASCII आर्ट की ज़रूरत है। उसको कैसे करे ?

उत्तर

2

हां, यह एक प्रसिद्ध समस्या है। आखिरी बार मैंने इसे हल किया है प्रत्येक पंक्ति के लिए एक सरणी का उपयोग करना और प्रत्येक पत्र को अलग से प्रस्तुत करना।

सबसे पहले, मैं एक सरणी में प्रत्येक अक्षर का प्रतिनिधित्व करता हूं। उदाहरण के लिए अपने एक कुछ इस तरह होगा: (। वास्तव में एक 2 डी सरणी जहां प्रत्येक अक्षर के लिए एक अलग सूचकांक पर है इस्तेमाल किया जाएगा)

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

वास्तविक प्रस्तुत करना और साथ ही एक सरणी में हो सकता है, कुछ के साथ कुछ:

char * प्रस्तुत करें [8];

और फिर प्रत्येक पंक्ति बनाने के लिए concatenation का उपयोग करें। एक बस पाश के लिए नेस्ट चाल करना चाहिए: सरणी हालांकि

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

क्या यह 2 डी सरणी का उपयोग कर रहा था ... लेकिन अंतरिक्ष-पैडिंग में कुछ समस्या का सामना करना .. उम्मीद है कि मैं इसे जल्द ही हल कर दूंगा .. – utsabiem

1

के बजाय एक पूरे मुद्रण (।। मेरे सी थोड़ा जंग लगी, वहां से "छद्म" कोड हालांकि, मुझे लगता है कि मेरी तर्क ध्वनि है) एक स्ट्रिंग के रूप में एक समय में चरित्र, पात्रों को कई तारों में विभाजित करें - एक पाठ की प्रत्येक पंक्ति के लिए जो चरित्र बनाता है। फिर प्रत्येक चरित्र, नई लाइन, फिर प्रत्येक चरित्र की दूसरी पंक्ति, आदि की पहली पंक्ति मुद्रित करें। आपको यह सुनिश्चित करने के लिए रिक्त स्थान के साथ लाइनों को पैड करना होगा कि वे सभी सही चौड़ाई हैं।

1

यह देखने के लिए बढ़िया है कि आपको फिलेट पसंद है। आपके द्वारा दिखाए जा रहे फिलेट विजेट में वास्तव में एक कमांड लाइन उपकरण होता है जो ASCII आउटपुट उत्पन्न करता है। http://www.figlet.org/ इसे ब्रू http://mxcl.github.com/homebrew/ के साथ आसानी से स्थापित किया जा सकता है।

सोचें कि आप आसानी से popen(..) या इसी तरह के अपने प्रोग्राम के भीतर से अपना आउटपुट कैप्चर कर सकते हैं।

नोट::

2

आप निम्न की तरह कुछ कोशिश कर सकते हैं जाहिर है, निम्नलिखित स्मृति de-आवंटन, त्रुटि जाँच, अधूरा कोड, आदि जैसी चीजों का एक बहुत कुछ विचार आप एक संकेत दे रहा है का अभाव !

#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 

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

> 

कार्यसूची:

  • आप नंबर, विशेष वर्ण (जैसे, @ # $, आदि!), खाली शामिल कर सकते हैं अंतरिक्ष, सभी ASCII वर्णों को समझ में आता है।
  • आप बोल्ड समर्थन कर सकते हैं इटैलिक्स, रेखांकन और वर्ण
  • आप अग्रभूमि और पृष्ठभूमि रंग का समर्थन कर सकते हैं
  • आप एनीमेशन

आशा इस मदद करता है समर्थन कर सकते हैं के लिए प्रकाश डाला!

+0

धन्यवाद, मुझे इसे आज़माएं .. मुझे लगता है कि जैको वैन ने इसी तरह के विचार के बारे में बताया था। – utsabiem