C语言中如何输出汉字;如何用C语言汉字编码输出汉字(超全版)
目录
- 前景提要
- 方式一:
- 方式二:
- 1. 数组方式打印
- 2. 指针方式打印
- 3. 优化为while方式
- 方式三:
- 1. 使用结构体内数组方式
- 2. 使用结构体内数组指针方式
- (1) 基础写法
- (2) 升级写法,指针的优化,去除一个for循环
- 总结
前景提要
- 想用char类型存储中文,然后打印出来
- 使用char [] 数组的方式打印,然后,因为一个汉子两个字节,所以,打印时候,需要两个%c
#define MAXSIZE 20int main()
{
char ch[MAXSIZE] = { "赵钱孙李周吴郑王" };
int j = 1;
for (int i = 0;
i <= 14;
i += 2) {
printf("第%d个姓氏是:%c%c\n", j++, ch[i], ch[i + 1]);
}}
- 存在问题: for循环的次数必须写死跟元素的个数一样,不能随便修改,否则,打印的时候,结果就会有乱码的情况.
- 解决方法:优化
if (ch[i] =='\0')
{
break;
}
** 完整**
#define MAXSIZE 20int main()
{
char ch[MAXSIZE] = { "赵钱孙李周吴郑王" };
int j = 1;
for (int i = 0;
i <= MAXSIZE;
i += 2) {
if (ch[i] =='\0')
{
break;
}
printf("第%d个姓氏是:%c%c\n", j++, ch[i], ch[i + 1]);
}}
方式二:
- 指针方式改写
实例
char *ch2;
char ch[MAXSIZE] = { "赵钱孙李周吴郑王" };
ch2 = (char *)malloc(sizeof(char));
ch2 = ch;
for (int i = 0;
i <= MAXSIZE;
i += 2) {if (ch2[i] =='\0')
{
break;
} printf("第%d个姓氏是:%c%c\n", j++, ch2[i], ch2[i + 1]);
}
2. 指针方式打印
实例
char *ch2;
char ch[MAXSIZE] = { "赵钱孙李周吴郑王" };
ch2 = (char *)malloc(sizeof(char));
ch2 = ch;
for (int i = 0;
i <= MAXSIZE;
i += 2) {if (*(ch2+i) =='\0')
{
break;
} printf("第%d个姓氏是:%c%c\n", j++, *(ch2+i), *(ch2 + i+1));
}
注意
- 不能写成如下形式,因为字符是一个字节,而汉子是两个,写成如下是无法输出的.
*(ch2 + 1) = '赵'; *(ch2 + 2) = '钱'; *(ch2 + 3) = '孙'; *(ch2 + 4) = '李'; *(ch2 + 5) = '周'; *(ch2 + 6) = '武';
实例
int main()
{
char ch[MAXSIZE] = { "赵钱孙李周吴郑王" };
int j = 1;
char *ch2;
ch2 = (char *)malloc(sizeof(char));
ch2 = ch;
int i = 0;
while (*(ch2 + i)!='\0')
{
printf("第%d个姓氏是:%c%c\n", j++, *(ch2 + i), *(ch2 + i + 1));
i += 2;
}}
方式三:
- 结构体数组改写
实例
#define MAXSIZE 20typedef char ElementType;
typedef int IntType;
typedef struct SequenceList { // 数组的元素
ElementType element[MAXSIZE];
// 数组的长度
IntType intType[MAXSIZE];
};
int main()
{
SequenceList*p;
int j = 1;
int k = 0;
char ch[20] = { "赵钱孙李周吴郑王" };
int array[20] = { 31,33,35,37,39,41,43,45 };
p = (SequenceList*)malloc(sizeof(SequenceList)*MAXSIZE);
if (p == NULL)
{
printf("error\n");
return 0;
}
for (int i = 0;
i < MAXSIZE;
i++)
{
p->element[i] = ch[i];
p->intType[i] = array[i];
}
for (int i = 0;
i <= MAXSIZE;
i += 2) {
if (p->element[i] == '\0') {
break;
}
printf("第%d个姓氏是:[00%d] = %c%c\n", j++, p->intType[k++], p->element[i], p->element[i + 1]);
}}
2. 使用结构体内数组指针方式
(1) 基础写法 实例
typedef char ElementType;
typedef struct SequenceListL { // 数组的元素
ElementType *element;
// 数组的长度
int length;
};
int main()
{
SequenceListL L;
L.element = (ElementType*)malloc(sizeof(ElementType) * 10);
if (L.element == NULL)
{
printf("error\n");
return 0;
} char ch[20] = { "赵钱孙李周吴郑王" };
for (int i = 0;
i < 20;
i++)
{
*(L.element + i) = ch[i];
} int j = 1;
for (int i = 0;
i <= 12;
i += 2) {
printf("第%d个姓氏是:%c%c\n", j++, L.element[i], L.element[i + 1]);
}}
(2) 升级写法,指针的优化,去除一个for循环
L.element = ch;
实例
typedef char ElementType;
typedef struct SequenceListL { // 数组的元素
ElementType *element;
// 数组的长度
int length;
};
int main()
{
SequenceListL L;
int j = 1;
L.element = (ElementType*)malloc(sizeof(ElementType) * 10);
char ch[20] = { "赵钱孙李周吴郑王" };
if (L.element == NULL)
{
printf("error\n");
return 0;
}
L.element = ch;
for (int i = 0;
i <= 12;
i += 2) {
printf("第%d个姓氏是:%c%c\n", j++, L.element[i], L.element[i + 1]);
}}
【C语言中如何输出汉字; 如何用C语言汉字编码输出汉字(超全版)】(3) 修改打印为指针打印
实例
typedef char ElementType;
typedef struct SequenceListL { // 数组的元素
ElementType *element;
// 数组的长度
int length;
};
int main()
{
SequenceListL L;
int j = 1;
L.element = (ElementType*)malloc(sizeof(ElementType) * 10);
char ch[20] = { "赵钱孙李周吴郑王" };
if (L.element == NULL)
{
printf("error\n");
return 0;
}
L.element = ch;
for (int i = 0;
i <= 12;
i += 2) {
printf("第%d个姓氏是:%c%c\n", j++, *(L.element + i), *(L.element + i + 1));
}}
(4) 优化打印结果中的乱码
- for循环次数变化的时候,会出现乱码
if (*(L.element + i) == '\0') { break; }
typedef char ElementType;
typedef struct SequenceListL { // 数组的元素
ElementType *element;
// 数组的长度
int length;
};
int main()
{
SequenceListL L;
int j = 1;
int i = 0;
L.element = (ElementType*)malloc(sizeof(ElementType) * 10);
char ch[20] = { "赵钱孙李周吴郑王" };
if (L.element == NULL)
{
printf("error\n");
return 0;
}
L.element = ch;
for (int i = 0;
i <= 20;
i += 2) {
if (*(L.element + i) == '\0') {
break;
}
printf("第%d个姓氏是:%c%c\n", j++, L.element[i], L.element[i + 1]);
}}
(5) 优化循环,减少循环次数,同时,可以很好的解决上一个for存在的乱码问题.
实例
typedef char ElementType;
typedef struct SequenceListL { // 数组的元素
ElementType *element;
// 数组的长度
int length;
};
int main()
{
SequenceListL L;
int j = 1;
int i = 0;
L.element = (ElementType*)malloc(sizeof(ElementType) * 10);
char ch[20] = { "赵钱孙李周吴郑王" };
if (L.element == NULL)
{
printf("error\n");
return 0;
}
L.element = ch;
while (*(L.element + i) != '\0') {
printf("第%d个姓氏是:%c%c\n", j++, *(L.element + i), *(L.element + i + 1));
i += 2;
}}
总结
- 打印汉字的方法确实比简单的输出'a','b''c'复杂了很多,想到很多情况
- 结构体指针这里确实有很多问题,不断的在改进
- 汉字的乱码过滤方式确实想了很久,跟之前的过滤方式不同,之前的方式请看c语言怎么避免打印空数据?
- 本博主遇到的这个问题能帮助到你,喜欢的话,请关注,点赞,收藏.
推荐阅读
- 如何在|如何在 Spring Boot 优雅关闭加入一些自定义机制
- C语言带参宏定义和函数的区别
- 如何在C#中使用Dapper|如何在C#中使用Dapper ORM
- 分析(如何将excel表格电话号码导入手机通讯录)
- 单片机|想从事单片机工作,C语言要达到什么水平()
- c语言|C语言开发单片机如何避免全局变量过多混乱
- c语言|最近在学C语言,非常痛苦,怎么办()
- 用R语言实现决策树分类
- C/C++语法深度学习|C++继承和多态核心重点知识刨析,一文必拿下
- C语言|C语言初阶学习——扫雷小游戏(递归)