前景提要

  • 想用char类型存储中文,然后打印出来

方式一:

  • 使用char [] 数组的方式打印,然后,因为一个汉子两个字节,所以,打印时候,需要两个%c

实例

#define MAXSIZE 20

int 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 20

int 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]); } }

方式二:

  • 指针方式改写

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) = '武';

3. 优化为while方式

实例

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;
} }

方式三:

  • 结构体数组改写

1. 使用结构体内数组方式

实例

#define MAXSIZE 20

typedef 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]); } }

(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语言怎么避免打印空数据?
  • 本博主遇到的这个问题能帮助到你,喜欢的话,请关注,点赞,收藏.

C语言中如何输出汉字;如何用C语言汉字编码输出汉字(超全版)的更多相关文章

  1. C语言中的位操作(12)--判断一个数字是否包含一个全零字节

    本文主要介绍一系列算法,算法主要功能是判断一个数字(二进制)中是否包含全零字节 e.g.1010 1111 0000 0000 1001 1111 0001 1111 即 32位整数:A4A3A2A1 ...

  2. C#将dataGridView中显示的数据导出到Excel(大数据量超有用版)

    开发中非常多情况下须要将dataGridView控件中显示的数据结果以Excel或者Word的形式导出来,本例就来实现这个功能. 因为从数据库中查找出某些数据列可能不是必需显示出来,在dataGrid ...

  3. IDEA中web项目打成war包并在本地tomcat部署(超细版)

    准备工作:相关软件及插件IDEA(2021.1.3).tomcat(8.5.50)且在IDEA中调用tomcat运行时没有任何错误的,如何下载安装百度都有详细的介绍,这里就不过多的介绍了,版本不同操作 ...

  4. C语言中格式字符串

    C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项. 一.类型 我们用一定的字符用以表示输出数据的类型,其格式符和意义下表所示: 字符  ...

  5. C语言中字符串的格式化

    本文整理转载自:http://wenku.baidu.com/view/065d62fff705cc1755270989.html C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度 ...

  6. c语言中类型转换与赋值运算符、算术运算符、关系运算符、逻辑运算符。原码、反码、补码。小解。

    类型转换 自动转换 小范围的类型能够自动转换成大范围的类型.short->int->long->float->double 强制类型转换 (类型名)变量或数值 #include ...

  7. 这样子来理解C语言中指针的指针

    友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...

  8. C语言中关于scanf函数的用法

    scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化 ...

  9. C语言中static的作用及C语言中使用静态函数有何好处

    转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...

随机推荐

  1. 集合框架-ListIterator接口

    1 package cn.itcast.p4.list.demo; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 imp ...

  2. 004 Linux 揭开神器 vim 面纱

    01 开篇初识 vim vim 功能吊炸天,但我们掌握一些常用的命令即可应对日常的使用了,不记流水账! Linux 中最常用的编辑器是什么? vim ! vi 跟 vim 啥区别? vim 就是 vi ...

  3. linux虚拟机快照

    目录 一:虚拟机快照 一:虚拟机快照 1.什么是快照? 快照可保存虚拟机在特定时刻的状态和数据. 状态包括虚拟机的电源状态(列如,打开电源,关闭电源,挂起). 数据包括组成虚拟机的所有文件,这包括磁盘 ...

  4. Java多线程专题2: JMM(Java内存模型)

    合集目录 Java多线程专题2: JMM(Java内存模型) Java中Synchronized关键字的内存语义是什么? If two or more threads share an object, ...

  5. ICLR2021对比学习(Contrastive Learning)NLP领域论文进展梳理

    本文首发于微信公众号「对白的算法屋」,来一起学AI叭 大家好,卷王们and懂王们好,我是对白. 本次我挑选了ICLR2021中NLP领域下的六篇文章进行解读,包含了文本生成.自然语言理解.预训练语言模 ...

  6. plsql 普通游标

    -- ①普通游标:操作步骤 边敲边想 学无止境 /* 游标:指针:内存中的一块数据缓冲区,上下文: 将查询到的结果集缓存起来,便于进行逐行定位处理. 使用完成后要及时关闭: 操作步骤? 1.定义游标 ...

  7. SharePoint Online 触发 Outlook 邮件内审批

    前言 我们在做SharePoint Online项目时, 经常会有客户问,我们能否在通知邮件中快速完成审批,而不是需要在邮件中打开系统,然后在系统中审批? 答案肯定是可以的,来!安排! 正文 1.我们 ...

  8. python pyautogui

    使用pyautogui随机调用图库里的一张照片设置为壁纸,每天定时执行 代码 import time import pyautogui import random pyautogui.keyDown( ...

  9. CSP2019 Day2T2 划分

    很显然有一个暴力 \(dp\),令 \(dp_{i, j}\) 表示最后一次划分在 \(i\) 上次划分在 \(j\) 的最小花费,令 \(S_i = \sum\limits_{j = 1} ^ i ...

  10. Atcoder ARC-062

    ARC062(2020.7.13) A 可以考虑直接同时扩大这次的两个票数,那么使得两数均大于之前位置的票数就是最优的,扩大的话直接除一下上取整即可. B 贪心即可. C 可以发现这个东西如果直接计数 ...