中文字符拆分显示乱码问题

程序主要代码:
int main (int argc, char argv[])
{
aes256_context ctx;
uint8_t key[32];
char *filename1="/home/phaeton/user/my_code/source.txt";
char *filename2="/home/phaeton/user/my_code/desc.txt";
int fctl1=0,fctl2=0;// 文件描述符
int tmp,i=0,j=0;
char buf[4096];
char buf1[16];
memset(buf,0,sizeof(char)*4096);
memset(buf1,0,sizeof(char)*16);

/
put a test vector */
for (i = 0; i < sizeof(key);i++) key[i] = i;
DUMP("key: ", i, key, sizeof(key));
printf("---\n");

fctl1=open(filename1,O_RDONLY);
  if(fctl1 == -1)
  {
       printf("open file error check the file state");
       return 0;
  }

  fctl2=open(filename2,O_WRONLY||O_APPEND||O_CREAT,777);
  if(fctl2 == -2)
    {
       printf("create file error ");
       return 0;
  }     

  tmp=read(fctl1,buf,4096);
  printf("%d",tmp);
  printf("\n");
  printf("%s\n",buf);
//处理buf[]中的文件数据,只能16位为一个单位进行加密  
for(i=0;i<tmp;i++)
{
    printf("%c",buf[i]); 
}
  printf("\n");

  for(i=0;i*16<tmp;i++)
  {
    for (j=0;j<16;j++)
    {
          printf("%c",buf[j+16*i]); 
    }   
    printf("\n");       
    /*aes256_init(&ctx, key);
  aes256_encrypt_ecb(&ctx, buf1);
    DUMP1("enc: ", j, buf, sizeof(buf1));

    aes256_init(&ctx, key);
    aes256_decrypt_ecb(&ctx, buf1);
    DUMP1("dec: ", j, buf, sizeof(buf1)); 
    aes256_done(&ctx);*/
  }    

return 0;

} /* main */

文件内容:
为什么会出现乱码 真是奇了怪了 整体输出没有问题
拆分开输出 就形成乱码
搞了一天了没搞明白

运行结果:
图片说明

求大神指导,实在搞不定了!

乱码就说明了要么是你拆分前后使用的字符编码是不一样,要么是你所使用的系统里中文字符不是16位