多个字符从两端向中间汇聚的实现结果百思不得其解

#include<stdio.h>
#include<string.h>
int main(void)
{
    char arr1[]="什么!是快乐星球!!";
    char arr2[]="####################";
    int left=0;
    int right=strlen(arr1)-1;
    while(left<=right)
    {
        arr2[left]=arr1[left];
        arr2[right]=arr1[right];
        left++;
        right--;
        printf("%s\n",arr2);
    }
    return 0;
 } 

实现结果

?#################?
什################!
什?#############。?
什么############!!
什么?#########颍。?
什么!########球!!
什么!?#####乔颍。?
什么!是####星球!!
什么!是?#中乔颍。?
什么!是快乐星球!!

这个结果队形为啥是这样的???多了一些我没有的

上面的代码在Dev-C++ 5.11下测试发现,里面的中文字符长度是两个字节,所以上面的代码每次复制一个字符的数据会导致输出异常。

修改如下:

参考链接:

#include<stdio.h>
#include<string.h>
int main(void)
{
    //https://ask.csdn.net/questions/7440145?spm=1005.2025.3001.5141 
   char arr1[]="什么!是快乐星球!!";
  //  char arr1[]="他";
    char arr2[]="####################";
   // char arr2[]="##";
    
    // https://www.zhihu.com/question/557033535?utm_id=0 
    // 经过测试发现,上面的中文字符 占两个字节长度 
   // printf("strlen(arr1)=%d\n",strlen(arr1));
    int left=0;
    int right=strlen(arr1)-1;
    while(left<=(right))
    {
        // 将要更新显示的数组在 左侧 依次赋值为要显示的字符数组里的两个字符 
        arr2[left]=arr1[left];
        arr2[left+1]=arr1[left+1];
      
      // 将要更新显示的数组在 右侧 依次赋值为要显示的字符数组里的两个字符   
        arr2[right]=arr1[right];
        arr2[right-1]=arr1[right-1];
        
        left+=2;// 左侧 往后 移动 两个 字符位置 
        right-=2; //右侧 往前 移动 两个 字符位置 
        printf("%s\n",arr2);
    }
    return 0;
 }

img