C语言 将汉字录入字符数组 打印后出现乱码

C语言 将汉字录入字符数组 打印后出现乱码

原目标:打印下图所示边框

img

使用代码:

#include <stdio.h>
#include <conio.h>
char jiemiankuang[25][50] = {};//定义界面 

#include <windows.h> //清屏操作声明头文件 、sleep头文件 
void _clean_screen() //设置光标标准句式 
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出的句柄
    COORD point = {0, 0}; // 位置(0,0),即控制台左上角。
    SetConsoleCursorPosition(hOut, point); // 设置光标位置
}

char element[][3] = //显示元素用 
{
    " ", // 这里是两个半角字符(空格)
    "■", // 一个全角字符
    // 其他元素
};

void chushibiankuang()//初始界面框 
{
        //------定义界面框—————— 
    int i = 0,j = 0;
    for (j=0;j<=24;j++)
    {
        for (i=0;i<=49;i++)
        {
            jiemiankuang[j][i] = '  ';
        }
    }
    for (i=0;i<=49;i++)
    {
        jiemiankuang[0][i] = '■';
        jiemiankuang[24][i] = '■';
    }
    for (i=0;i<=24;i++)
    {
        jiemiankuang[i][0] = '■';
        jiemiankuang[i][24] = '■';
    //----------------------------------
    }    
} 

void print_shuaxin() //打印边框函数
{
    _clean_screen();
    for (int j=0;j<25;j++) 
        for (int i=0;i<50;i++)
            {
            HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出的句柄
            COORD point = {i, j}; // 位置(0,0),即控制台左上角。
            SetConsoleCursorPosition(hOut, point); 
            printf("%c",jiemiankuang[i][j]);
            }    
}

int main()
{
    chushibiankuang();
    print_shuaxin();
}  


出现错误,打印结果为乱码,如图所示:

img

初步判断问题为:
保存汉字汉字需要2个字节,但仅保存了低位,没能实现高位保存、输出。

请问如何修改,谢谢!

你都知道占两个字节了,还赋值 一个 char 类型的呀
修改如下:

#include <stdio.h>
#include <conio.h>
#include <string.h>
char jiemiankuang[25][50][3] = {};//定义界面 
 
#include <windows.h> //清屏操作声明头文件 、sleep头文件 
void _clean_screen() //设置光标标准句式 
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出的句柄
    COORD point = {0, 0}; // 位置(0,0),即控制台左上角。
    SetConsoleCursorPosition(hOut, point); // 设置光标位置
}
 
char element[][3] = //显示元素用 
{
    " ", // 这里是两个半角字符(空格)
    "■", // 一个全角字符
    // 其他元素
};
 
void chushibiankuang()//初始界面框 
{
        //------定义界面框—————— 
    int i = 0,j = 0;
    for (j=0;j<=24;j++)
    {
        for (i=0;i<=49;i++)
        {
            strcpy(jiemiankuang[j][i]," ");
        }
    }
    for (i=0;i<=49;i++)
    {
        strcpy(jiemiankuang[0][i], "■");
        strcpy(jiemiankuang[24][i], "■");
    }
    for (i=0;i<=24;i++)
    {
        strcpy(jiemiankuang[i][0],"■");
        strcpy(jiemiankuang[i][24],"■");
    //----------------------------------
    }    
} 
 
void print_shuaxin() //打印边框函数
{
    _clean_screen();
    for (int j=0;j<25;j++) 
        for (int i=0;i<50;i++)
            {
            HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出的句柄
            COORD point = {i, j}; // 位置(0,0),即控制台左上角。
            SetConsoleCursorPosition(hOut, point); 
            printf("%s",jiemiankuang[i][j]);
            }    
}
 
int main()
{
    chushibiankuang();
    print_shuaxin();
}  
 

编码模式使用的utf8模式了吗?

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7568146
  • 这篇博客你也可以参考下:利用C语言将数字、字符等数据写入、输出到文本文件中
  • 除此之外, 这篇博客: 【C语言】满分通讯录,保姆级教程,不来看看?中的 判断通讯录是否需要扩容 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 我们创建好了通讯录,需要对它初始化,但这里就有一个问题。

    初始化的时候我需要先给通讯录分配一块空间,然后从文件中读取初始数据,如果在读取的过程中通讯录满了,那就需要扩容,所以我们要先封装一个函数用来判断通讯录是否需要扩容:

    //初始联系人的数量
    #define InitSize 3 
    //每次扩容的数量
    #define AddSize 2  
    
    //函数声明 - 检查是否需要增容
    void IsFull(Contact* pc);
    
    
    void IsFull(Contact* pc)
    {
    	if (pc->capacity == pc->sz)
    	{
    		PeoInfo* tmp = ((PeoInfo*)realloc(pc->PeoInfo, sizeof(PeoInfo) * (pc->capacity + AddSize)));
    		if (tmp == NULL)
    		{
    			perror("IsFull");
    			return;
    		}
    		pc->PeoInfo = tmp;
    		pc->capacity += AddSize;
    		printf("增容成功\n");
    	}
    }
    

  • 您还可以看一下 贺利坚老师的C语言及程序设计初步课程中的 将数据保存到文本文件小节, 巩固相关知识点