“图像反射”程序(不是实际图像,只反映用字符制作的图纸)

时间:2016-11-26 23:03:22

标签: c arrays string pointers multidimensional-array

这是我的代码。有两个功能,一个用于打印图像,另一个用于反转。我对指针和数组并不擅长。我知道我必须将数组作为指针返回,因为函数不返回数组。所以我不知道哪些是错误。我知道如何在不使用函数的情况下完成它,但我必须使用单独的函数来完成它。当我打印图像时(是的它是皮卡丘)我将它从文件中保存并打印出来以查看它是否正确保存,是的确如此,但在反映它时会打印出一些随机字符。这是皮卡丘。

                                         so                       
                                        sNm                       
  .yhyo/-`                             yNNN                       
   `sNNNNh:-.`                        :sdNN                       
     .yNNh:::::-.                    -:::/s                       
       .sh::::::::-.                `:::::-                       
         `.:/::::::::.  `           -:::::.                       
            `.-:/:::::::::::::-.`   ::::::                        
                ``-:::::::::::::::-.::::/.                        
                 .:::::::::::::::::::::/:                         
                .::oh//:::::::::::::::::`                         
               .:::ymy+::::::::::::::::.                          
              .oo:::::::::/:::::o/yo::/                           
             `ooo/::::+osss+::::ommo::-                           
             `oo+:::::++///oyo:::::::/`                           
              -/::::::/:::::+/:::::/++.--::::.                    
            ``.:/:::::/::::/:::::/ooo+:::::::/`                   
         `-::::::::::::/:/:::::::+oo/:::::://:```                 
        `/::::::::::::/:::::::/::/::::::::/::::::::::--.`         
         ::::::::::::://:::::::::::::::::/:::::::::::::::::--.`   
         `:///:::::////::::::::::::::/:. :::/:::::::::::::::::::` 
           `-/////:::::::::::::::://:.  .:://///::::::::::::::.   
            :::::::::::::::::::::::`    :://///////::::::::-.     
           -::::::::::::::::::::::. ----:://:   `.--::/::-`       
          .:::::::::::::::::::::::` :/::::/-           ``         
         `::::::::::::::::::::::::. :+/--:.                       
         -::::::::::::::::::::::::+ossy                           
         /:::::::::::::::::::::::::/:/+                           
        `/::::::::::::::::::::::::::`                             
         .//////:::::://///:::::::::`                             
      `-//::////...````.---::////:/-.                             
      `.-...``                .-::/::/:.                          
                                   ``.-.                          

打印出来:

                   os
                   mNs
                   NNNy                             `-/oyhy.
                   NNds:                        `.-:hNNNNs`
                   s/:::-                    .-:::::hNNy.
                   -:::::`                .-::::::::hs.
                   .:::::-           `  .::::::::/:.`
                    ::::::   `.-:::::::::::::/:-.`
                    ./::::.-:::::::::::::::-``
                     :/:::::::::::::::::::::.
                     `::::::::::::::::://ho::.
                      .::::::::::::::::+ymy:::.
                       /::oy/o:::::/:::::::::oo.
                       -::ommo::::+ssso+::::/ooo`
                       `/:::::::oyo///++:::::+oo`
                .::::--.++/:::::/+:::::/::::::/-
               `/:::::::+ooo/:::::/::::/:::::/:.``
             ```://::::::/oo+:::::::/:/::::::::::::-`
     `.--::::::::::/::::::::/::/:::::::/::::::::::::/`

.--:::::::::::::::::/::::::::::::::::://::::::::::::: :::::::::::::::::::::::::::::::::::::::: // // ::::: ///: .:::::::::::::://///::. .://:::::::::::::::://///-      .- :::::::: ///////// :: :::::::::::l▌ w£ⁿrtÉX║ P0 ¡ⁿrt É ::::╗{ {1}}           h╗ ......-。`

造成这种情况的原因,我确定它是如何发送和保存反向字符数组的。但我不知道如何解决它。

-/::::/: `:::::::::::::::::::::::.
          |▌`wyæst               X╗` ╪╗`            Ü╪«$           ä╗` ╛·rt       @╗`    ╚╓` P╓vt╩Q│P■   É╓` 9▌⌠v   ╪╗`    ░╗`            ╟α⌠v::::                             $           ╫` ╫`
                   +/:/:::::::::::::::::::::::::/
                             `::::::::::::::::::::::::::/`
                             `::::::::://///:::::://////.
                             .-/:////::---.````...////:://-`
                          .:/::/::-.

1 个答案:

答案 0 :(得分:0)

主要问题似乎是你的程序分配了一个最大线宽(100),读取的行比那个短(66),然后尝试根据最大宽度反转读取的行,基本上是复制垃圾。您需要使用实际宽度,或使用空格或两者填充到最大值。

另一个问题是你对最大宽度和最大高度都使用相同的值#define S 100,这是不现实的,然后不要在代码中使用它:

char buf[S],buf2[S][S],**refpic;
while(fgets(buf, 100, fp) != NULL)
strncpy(refpic,buf2,S);
for(b=0;b<100;b++)
refpic[a][b]=str[a][99-b];
void printImage(char str[S][S],int i)

我们不应该看到任何100(或99)。

您似乎也假设图像将在右侧填充空间,这并不总是使用ASCII艺术。并且不清楚你是否在逆转中正确处理尾随换行符。下面是我的工作,解决上述问题和一些风格调整:

#include <stdio.h>
#include <string.h>

#define MAX_LINES 200
#define MAX_COLUMNS 100

void printImage(char image[][MAX_COLUMNS], int n_lines, int n_cols)
{
    for (int a = 0; a < n_lines; a++)
    {
        for (int b = 0; b < n_cols; b++)
        {
            putchar(image[a][b]);
        }

        putchar('\n');
    }
}

void reverseImage(char image[][MAX_COLUMNS], char reverse[][MAX_COLUMNS], int n_lines, int n_cols)
{
    for (int a = 0; a < n_lines; a++)
    {
        for (int b = 0; b < n_cols; b++)
        {
            reverse[a][b] = image[a][n_cols - b - 1];
        }
    }
}

int main(int argc, char *argv[])
{
    FILE *fp = fopen(argv[1], "r");

    char buf2[MAX_LINES][MAX_COLUMNS]; 

    int row = 0, columns = 0;

    while (fgets(buf2[row], MAX_COLUMNS, fp) != NULL)
    {
        size_t length = strlen(buf2[row]) - 1;

        if (length > columns)
        {
            columns = length;
        }

        for (int j = length; j < MAX_COLUMNS - 1; j++)
        {
            buf2[row][j] = ' ';
        }

        buf2[row][MAX_COLUMNS - 1] = '\0';

        row++;
    }

    fclose(fp);

    printImage(buf2, row, columns);

    char refpic[MAX_LINES][MAX_COLUMNS];

    reverseImage(buf2, refpic, row, columns);

    printImage(refpic, row, columns);

    return 0;
}

示例

> ./a.out aardvark.txt
    ,__    _,            ___                   
     '.`\ /`|     _.-"```   `'.                
       ; |  /   .'             `}              
       _\|\/_.-'                 }             
   _.-"a                 {        }            
.-`  __    /._          {         }\           
'--"`  `""`   `\   ;    {         } \          
               |   } __ _\       }\  \         
               |  /;`   / :.   }`  \  \        
               | | | .-' /  / /     '. '._     
      jgs    .'__/-' ````.-'.'        '-._'-._ 
             ```        ````              `"""`
                   ___            ,_    __,    
                .'`   ```"-._     |`/ \`.'     
              }`             '.   /  | ;       
             }                 '-._/\|\_       
            }        {                 a"-._   
           \}         {          _./    __  `-.
          \ }         {    ;   \`   `""`  `"--'
         \  \}       \_ __ }   |               
        \  \  `}   .: /   `;/  |               
     _.' .'     / /  / '-. | | |               
 _.-'_.-'        '.'-.```` '-/__'.    sgj      
`"""`              ````        ```             
>

请注意,反转ASCII艺术并不总是一个好主意......