为什么加了system(“cls")后矩阵图形会变?

问题相关代码,请勿粘贴截图

#include<stdio.h>
#include <windows.h>
char a[50][50];
void tuxing1()
{
int i,j;
//右上
for(i=6;i<=10;i++)
for(j=1;j<=5;j++)
{
if(j<=5-(i-5))
a[i][j]=' ';
else
a[i][j]='1';
}
for(i=6;i<=10;i++)
for(j=6;j<=10;j++)
a[i][j]='1';

//左上 
for(i=1;i<=5;i++)
 for(j=11;j<=10+i;j++)
   a[i][j]='2';
for(i=6;i<=10;i++)
 for(j=11;j<=15;j++)
  a[i][j]='2';

 //左下 
 for(i=16;i<=20;i++)
 for(j=6;j<=10;j++)
   {
       if(j<=(i-10))
        a[i][j]=' ';
        else a[i][j]='2';
   }
for(i=11;i<=15;i++)
 for(j=6;j<=10;j++)
  a[i][j]='2';

 //右下 
 for(i=11;i<=15;i++)
 for(j=16;j<=31-i;j++)
   {
        
         a[i][j]='1';
   }  
for(i=11;i<=15;i++)
 for(j=11;j<=15;j++)
  a[i][j]='1';
for(i=1;i<=20;i++)
 {
     for(j=1;j<=20;j++)
 {
     printf("%c",a[i][j]);
  } 
  printf("\n");
 }

}
void tuxing2()
{

int i,j;
//右上 
for(i=6;i<=10;i++)
 for(j=1;j<=5;j++)
   {
       if(j<=5-(i-5))
       a[i][j]=' ';
    else
       a[i][j]='2';
   }
for(i=6;i<=10;i++)
 for(j=6;j<=10;j++)
  a[i][j]='2';

//左上 
for(i=1;i<=5;i++)
 for(j=11;j<=10+i;j++)
   a[i][j]='1';
for(i=6;i<=10;i++)
 for(j=11;j<=15;j++)
  a[i][j]='1';

 //左下 
 for(i=16;i<=20;i++)
 for(j=6;j<=10;j++)
   {
       if(j<=(i-10))
        a[i][j]=' ';
        else a[i][j]='1';
   }
for(i=11;i<=15;i++)
 for(j=6;j<=10;j++)
  a[i][j]='1'; 
 //右下 
 for(i=11;i<=15;i++)
 for(j=16;j<=31-i;j++)
   {
        
         a[i][j]='2';
   }  
for(i=11;i<=15;i++)
 for(j=11;j<=15;j++)
  a[i][j]='2';
for(i=1;i<=20;i++)
 {
     for(j=1;j<=20;j++)
 {
     printf("%c",a[i][j]);
  } 
  printf("\n");
 }

}
int main(){ //主函数入口
int k=1;
tuxing1();
while(1){
system("cls");
if(k%2==0){
tuxing2();
Sleep(400); //控制停顿时间
}else{
tuxing1();
Sleep(400); //控制停顿时间
}
k++;
}
return 0;
}

运行结果及报错内容

img

我的解答思路和尝试过的方法

删除system(”cls“)

img

我想要达到的结果

虽然删除清屏的代码后 ,所显示的矩阵图形是对的,但是实现不了只在一个界面,会一直循环出现,本意是想让其循环但只出现一个图形而非一直循环出现图形。
有点绕

仅供参考:

#include <windows.h>
#include <stdio.h>

void ConPrint(char *CharBuffer, int len);
void ConPrintAt(int x, int y, char *CharBuffer, int len);
void gotoXY(int x, int y);
void ClearConsole(void);
void ClearConsoleToColors(int ForgC, int BackC);
void SetColorAndBackground(int ForgC, int BackC);
void SetColor(int ForgC);
void HideTheCursor(void);
void ShowTheCursor(void);

int main(int argc, char* argv[])
{
   HideTheCursor();
   ClearConsoleToColors(15, 1);
   ClearConsole();
   gotoXY(1, 1);
   SetColor(14);
   printf("This is a test...\n");
   Sleep(5000);
   ShowTheCursor();
   SetColorAndBackground(15, 12);
   ConPrint("This is also a test...\n", 23);
   SetColorAndBackground(1, 7);
   ConPrintAt(22, 15, "This is also a test...\n", 23);
   gotoXY(0, 24);
   SetColorAndBackground(7, 1);
   return 0;
}

//This will clear the console while setting the forground and
//background colors.
void ClearConsoleToColors(int ForgC, int BackC)
{
   WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
   //Get the handle to the current output buffer...
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   //This is used to reset the carat/cursor to the top left.
   COORD coord = {0, 0};
   //A return value... indicating how many chars were written
   //not used but we need to capture this since it will be
   //written anyway (passing NULL causes an access violation).
   DWORD count;

   //This is a structure containing all of the console info
   // it is used here to find the size of the console.
   CONSOLE_SCREEN_BUFFER_INFO csbi;
   //Here we will set the current color
   SetConsoleTextAttribute(hStdOut, wColor);
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //This fills the buffer with a given character (in this case 32=space).
      FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);

      FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      //This will set our cursor position for the next print statement.
      SetConsoleCursorPosition(hStdOut, coord);
   }
}

//This will clear the console.
void ClearConsole()
{
   //Get the handle to the current output buffer...
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   //This is used to reset the carat/cursor to the top left.
   COORD coord = {0, 0};
   //A return value... indicating how many chars were written
   //   not used but we need to capture this since it will be
   //   written anyway (passing NULL causes an access violation).
   DWORD count;
   //This is a structure containing all of the console info
   // it is used here to find the size of the console.
   CONSOLE_SCREEN_BUFFER_INFO csbi;
   //Here we will set the current color
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //This fills the buffer with a given character (in this case 32=space).
      FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      //This will set our cursor position for the next print statement.
      SetConsoleCursorPosition(hStdOut, coord);
   }
}

//This will set the position of the cursor
void gotoXY(int x, int y)
{
   //Initialize the coordinates
   COORD coord = {x, y};
   //Set the position
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

//This will set the forground color for printing in a console window.
void SetColor(int ForgC)
{
   WORD wColor;
   //We will need this handle to get the current background attribute
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   CONSOLE_SCREEN_BUFFER_INFO csbi;

   //We use csbi for the wAttributes word.
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //Mask out all but the background attribute, and add in the forgournd color
      wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
      SetConsoleTextAttribute(hStdOut, wColor);
   }
}

//This will set the forground and background color for printing in a console window.
void SetColorAndBackground(int ForgC, int BackC)
{
   WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);;
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
}

//Direct console output
void ConPrint(char *CharBuffer, int len)
{
   DWORD count;
   WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), CharBuffer, len, &count, NULL);
}

//Direct Console output at a particular coordinate.
void ConPrintAt(int x, int y, char *CharBuffer, int len)
{
   DWORD count;
   COORD coord = {x, y};
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleCursorPosition(hStdOut, coord);
   WriteConsole(hStdOut, CharBuffer, len, &count, NULL);
}

//Hides the console cursor
void HideTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = FALSE;
      SetConsoleCursorInfo(hStdOut,    &cciCursor);
   }
}

//Shows the console cursor
void ShowTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = TRUE;
      SetConsoleCursorInfo(hStdOut,    &cciCursor);
   }
}