c - "Image reflecting"程序(不是实际图像,仅反射(reflect)用字符绘制的图画)

标签 c arrays string pointers multidimensional-array

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

                                         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║ P 0 ¡ⁿrtÉ::::h╗ -/::::/: `::::::::::::::::::::::::。 |▌`wyæst X╗` ╪╗` Ü╪«$ ä╗` ╛·rt @╗` ╚╓` P╓vt╩Q│P■   É╓` 9▌⌠v ╪╗` ░╗` ╟α⌠ v::::$ ╫` ╫` +/:/::::::::::::::::::::::::::/ `::::::::::::::::::::::::::/` `::::::::://///:::::://////。 .-/:////::---.````...////:://-` .:/::/::-....-.`

是什么原因造成的,我确信这就是我发送和保存反转字符数组的方式。但我不知道如何解决它。

#include<stdio.h>
#include<string.h>
#define S 100

char** Reverse(char str[S][S],int i);
void printImage(char str[S][S],int i);
int main()
{
    int i=0;
    FILE *fp;
    char buf[S],buf2[S][S],**refpic;
    fp = fopen("pikachu.txt","r");
    while(fgets(buf, 100, fp) != NULL)
    {
        strcpy(buf2[i],buf);
        i++;


    }
    fclose(fp);



    printImage(buf2,i);

    refpic=Reverse(buf2,i);
    strncpy(refpic,buf2,S);
    printImage(refpic,i);

    return 0;
}
char** Reverse(char str[S][S],int i)
{
    int a=0,b=0;
    char refpic[S][S];

    for(a=0;a<i;a++)
    {

        for(b=0;b<100;b++)
        {

            refpic[a][b]=str[a][99-b];
        }
    }

    return refpic;
}
 void printImage(char str[S][S],int i)
{
    int a=0,b=0;


    for(a=0;a<i;a++)
        {
            for(b=0;b<100;b++)
            {
                printf("%c", str[a][b]);
            }
        }

}

最佳答案

主要问题似乎是您的程序分配最大行宽度(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 艺术并不总是一个好主意......

关于c - "Image reflecting"程序(不是实际图像,仅反射(reflect)用字符绘制的图画),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40824046/

相关文章:

c - 使用 char 的字符的十六进制表示不正确,但使用 unsigned char 则正确

c# - 多个数组计数比较 C#

java - 从 JSON Web 服务检索 android 中的 byte[]

python - 在 Python 中使用 str.replace() 删除函数包装

java - 删除字符串中数字后面的任何内容

python-3.x - 为什么Python在这段看似简单的代码中不拼接换行符呢?

c - 自己的简单网络服务器不发送页面

c++ - 使用 C++ 函数中的汇编器为循环编码

C - PlaySound() 在将位置作为 char[] 传递时找不到文件

c - 令人惊讶的指针