C语言 将汉字录入字符数组 打印后出现乱码
原目标:打印下图所示边框
使用代码:
#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();
}
出现错误,打印结果为乱码,如图所示:
初步判断问题为:
保存汉字汉字需要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模式了吗?
我们创建好了通讯录,需要对它初始化,但这里就有一个问题。
初始化的时候我需要先给通讯录分配一块空间,然后从文件中读取初始数据,如果在读取的过程中通讯录满了,那就需要扩容,所以我们要先封装一个函数用来判断通讯录是否需要扩容:
//初始联系人的数量
#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");
}
}