【问题标题】:"Image reflecting" program (not actual image, just reflects drawings made with characters)“图像反映”程序(不是实际图像,只是反映用字符制作的图纸)
【发布时间】:2016-11-26 23:03:22
【问题描述】:

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

                                         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 É :::: 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]);
            }
        }

}

【问题讨论】:

  • 欢迎来到 Stack Overflow!听起来您可能需要学习如何使用调试器来逐步执行代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs.

标签: c arrays string pointers multidimensional-array


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2016-10-06
    • 1970-01-01
    • 2019-07-13
    相关资源
    最近更新 更多