C语言中如何输出汉字;如何用C语言汉字编码输出汉字(超全版)
前景提要
- 想用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语言汉字编码输出汉字(超全版)的更多相关文章
- C语言中的位操作(12)--判断一个数字是否包含一个全零字节
本文主要介绍一系列算法,算法主要功能是判断一个数字(二进制)中是否包含全零字节 e.g.1010 1111 0000 0000 1001 1111 0001 1111 即 32位整数:A4A3A2A1 ...
- C#将dataGridView中显示的数据导出到Excel(大数据量超有用版)
开发中非常多情况下须要将dataGridView控件中显示的数据结果以Excel或者Word的形式导出来,本例就来实现这个功能. 因为从数据库中查找出某些数据列可能不是必需显示出来,在dataGrid ...
- IDEA中web项目打成war包并在本地tomcat部署(超细版)
准备工作:相关软件及插件IDEA(2021.1.3).tomcat(8.5.50)且在IDEA中调用tomcat运行时没有任何错误的,如何下载安装百度都有详细的介绍,这里就不过多的介绍了,版本不同操作 ...
- C语言中格式字符串
C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项. 一.类型 我们用一定的字符用以表示输出数据的类型,其格式符和意义下表所示: 字符 ...
- C语言中字符串的格式化
本文整理转载自:http://wenku.baidu.com/view/065d62fff705cc1755270989.html C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度 ...
- c语言中类型转换与赋值运算符、算术运算符、关系运算符、逻辑运算符。原码、反码、补码。小解。
类型转换 自动转换 小范围的类型能够自动转换成大范围的类型.short->int->long->float->double 强制类型转换 (类型名)变量或数值 #include ...
- 这样子来理解C语言中指针的指针
友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...
- C语言中关于scanf函数的用法
scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化 ...
- C语言中static的作用及C语言中使用静态函数有何好处
转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...
随机推荐
- mysqldump 逻辑备份和物理备份
逻辑备份 逻辑备份是备份sql语句,在恢复的时候执行备份的sql语句实现数据库数据的重现. 工具:mysqldump 特点: 1.可移植性比较强 2.备份和恢复的花费时间长,不适用于大型业务系统 物理 ...
- kubernetes之部署traefik-ingress分为http和https
1 理解Ingress 简单的说,ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上.Ingress相当于nginx.apache等负载均衡方 ...
- Android安卓开发一环境配置
安卓项目开发 我采用的安卓开发软件是IDEA,IDEA功能强大,具有集成的安卓开发环境. 安卓开发的首要任务是在IDEA配置安卓开发环境 第一步新建一个安卓项目 按照提示完成操作,首次建立安卓项目它会 ...
- 分页方法需要参数(当前页数,总数据量,拿到query的值)
class Pagination: def __init__(self, page_num, all_count ,params=None,per_num=10,max_show=11): " ...
- JavaScript之 函数节流(Throttling) 与 防抖(Debounce)
Throttling:在监听鼠标移动事件.盒子滚动事件等使用节流技术能节省性能消耗 /** * 节流函数(每隔t执行一次) */ function Throttling(fn, t) { const ...
- APschedule定时任务
APScheduler是Python的一个定时任务框架,可以很方便的满足用户定时执行或者周期执行任务的需求, 它提供了基于日期date.固定时间间隔interval .以及类似于Linux上的定时任务 ...
- 使用require.context实现前端工程自动化
require.context是什么 一个webpack的api,通过执行require.context函数获取一个特定的上下文,主要用来实现自动化导入模块,在前端工程中,如果遇到从一个文件夹引入很多 ...
- AT2400 [ARC072B] Alice&Brown
通过打表后可以发现,当初始石头数 \(|X - Y| \le 1\) 时先手必败否则先手必胜. 我们考虑使用归纳证明这个结论,显然 \((1, 0), (1, 1)\) 时是成立的. 基于观察,我们可 ...
- 在IDE中添加widfly依赖
动机:在IDE中添加widfly依赖 原由:widfly实现了servlet接口,有我们对外交互时所需求的jar包 步骤: 第一步: 找到module依赖的地方 第二步:点击左侧的添加按钮,点击Lib ...
- Springboot整合RocketMQ解决分布式事务
直接上代码: 代码结构如下: 依次贴出相关类: DataSource1Config: package com.example.demo.config;import org.apache.ibatis. ...