[zz]如何在C语言程序中处理汉字
学习过C语言的人也许有时会遇到这样一个问题:如何用变量存储汉字以及对这些变量进行操作。目前许多C语言参考书中都没涉及到这个问题,程序中多为处理英文变量和英文字符串,涉及到汉字的情况也大都是在printf语句中输出提示信息或结果,如:
- printf("请输入a,b的值:\n");
- printf("输出功率为%s千瓦。\n",power);
复制代码
考虑到还有相当一部分人在学习和应用C语言,因此在这里向读者介绍一下笔者在这方面摸索出来的经验。
存储汉字应该用字符数组,这一点是肯定的,关键问题是汉字在你的计算机系统上占几个字节。多数人会认为一个汉字肯定占两个字节,其实不然。汉字到底占几个字节,这是随系统不同而不同的,而且还依赖于软件环境,如Visual Basic中汉字占一个字节。可以在你的计算机上用strlen()函数测试一下,如:
- printf("%d",strlen("计算机"));
复制代码
若输出为6,则每个汉字占两个字节;若输出12,则每个汉字占四个字节。大多数系统是每个汉字占两个字节的,即上述语句输出值为6。应当注意的是一个全角字符(包括标点符号)同汉字占据相同的字节。本文假定每个汉字占两个字节。
这样你就可以用字符数组存储汉字了,但别忘了,由于C语言中字符串是以'\0'作为结束标记的,系统会自动加上这个标记符,而用strlen()函数测试的返回值不包括这个'\0',因此在定义和初始化字符数组时应当使数组长度最小为实际字符串长再加1,如:
- static char name[7]="孙悟空"; /*数组长度为7说明最多可存放3个汉字*/
复制代码
如果把数组长度定义为6,系统在编译时并不报错,但是当运行程序时有时会莫名其妙地重复输出或多输出汉字,如果出现这种情况,应当首先考虑数组长度是否有问题。当然在定义的同时初始化可以省略数组长度,如:
- static char array[]={"中国计算机软件专业技术水平考试"};
复制代码
同样可以定义二维数组,下面这个二维数组可以存放10个人名:
- char member[10][8]; /*10个元素,每个元素中最多能放3个汉字(不是4个!)*/
复制代码
因为二维数组member[10][8]可以看成特殊的一维数组member[0],member[1],…,member[9],这些一维数组分别表示各行,而一行就表示了一个人名,因此如果想操作每个人名,只需写成member[0],member[1],…而不写成member[0] [8],member[1][8],…。
顺便提一下,在C编译窗口中输入汉字需要中文环境。如果读者用的是DOS操作系统,那么就需要安装CCDOS或UCDOS;如果是WIN95/98操作系统,则在DOS命令窗口中运行下面这个批处理文件即可,而不必另外安装中文DOS系统:
C:\WINDOWS>PDOS95
在C编辑窗口中用Ctrl+空格键启动WIN95中文输入法。另外由于C程序是基于DOS的,因此编辑、编译C程序最好在全屏幕状态,否则容易出现问题。
下面给出一个实例程序,它的功能是计算出输入年份的天干地支。
- #include "string.h"
- main()
- {
- int a,b,year;
- char gz[6]; /*用来表示干支的字符变量*/
- /*注意:下面两个语句中{}内的引号和逗号不能为全角字符*/
- static char tg[10][3]={"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
- static char dz[12][3]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戍","亥"};
- printf("请输入一个年份:");
- scanf("%d",&year);
- a=(year-1804)%10; /*以1804年为参考年份,1804年是甲子年*/
- b=(year-1804)%12;
- strcpy(gz,tg[a]);
- strcat(gz,dz[b]);
- printf("%d年的干支为:%s\n",year,gz);
- }
复制代码
运行结果:
请输入一个年份:1999
1999年的干支为:己卯
[zz]如何在C语言程序中处理汉字的更多相关文章
- 如何在Android应用程序中使用传感器模拟器SensorSimulator
原文地址; 如何在Android应用程序中使用传感器模拟器 - 移动平台应用软件开发技术 - 博客频道 - CSDN.NET http://blog.csdn.net/pku_android/arti ...
- 转:如何在32位程序中突破地址空间4G的限制
//如何在32位程序中突破地址空间4G的限制 //首先要获得内存中锁定页的权限 #define _WIN32_WINNT 0x0501 //xp系统 #include <windows.h> ...
- 如何在Silverlight应用程序中获取ASP.NET页面参数
asp.net Silverlight应用程序中获取载体aspx页面参数 有时候SL应用中需要使用由aspx页面中传递过来的参数值,此时通常有两种方法获取 1. 使用InitParameters属性, ...
- C++虚函数作用原理(一)——虚函数如何在C++语言逻辑中存在
C++多态,接触其实也没太长的时间.上课的时候老师总是不停的讲,多态可以实现利用一个基类对象调用不同继承类的成员函数.我就会觉得很伤脑筋,这个的原理到底是什么?是什么呢? 开始的时候我觉得自己应该能够 ...
- 如何在Android应用程序中使用传感器(OpenIntents开源组织SensorSimulator项目)
原文地址http://blog.sina.com.cn/s/blog_621c16b101013ygl.html OpenIntents项目和可用资源介绍 [1]. 项目介绍:OpenInten ...
- 如何在WPF应用程序中使用视频处理控件TVideoGrabber
要在WPF 中使用 TVideoGrabber 组件,需要像下面的方法来使用 VS.NET(DLL) 版本的组件: ——复制TVideoGrabber_x.x.x.x_x86.dll到c:/windo ...
- [Prism框架实用分享]如何在Prism应用程序中使用日志
前言 在Prism中有关日志的命名空间: Microsoft.Practices.Prism.Logging 在Prism中,你可以使用Prism自带的Logger(比如TextLogger等),也可 ...
- 示例 - 如何在Console应用程序中应用SpiderStudio生成的DLL?
以前面生成的XML/JSON互转DLL为例, 我们写一个Console Appliction来做这件事情, 步骤如下: 1. 创建Console Project 2. 引入www.utilities_ ...
- 如何在Qt 4程序中优化布局结构(表格讲解,很清楚)
原文地址:http://blog.csdn.net/qter_wd007/archive/2010/03/13/5377882.aspx 在迄今为止讲到每一个例子中,我们只是简单的把窗口部件放置到某个 ...
随机推荐
- java.net.SocketException: Software caused connection abort: socket write error
用Java客户端程序访问Java Web服务器时出错: java.net.SocketException: Software caused connection abort: socket write ...
- php中return的用法实例分析
本文实例讲述了php中return的用法.分享给大家供大家参考.具体分析如下: 首先,它的意思就是返回;return()是语言结构而不是函数,仅在参数包含表达式时才需要用括号将其括起来.当返回一个变量 ...
- 【工匠大道】Git的使用总结
初衷是想将一些常用的代码整理在博客园上,但是考虑到博客园上的代码量多,需要折叠,折叠后就不能直接修改,于是想到了 大家都常用的 gitHub来进行代码的管理. 其实之前我是用过 Osa的git的,但是 ...
- java泛型详解
http://www.cnblogs.com/lwbqqyumidi/p/3837629.html
- 26、ASP.NET MVC入门到精通——后台管理区域及分离、Js压缩、css、jquery扩展
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 有好一段时间没更新博文了,最近在忙两件事:1.看书,学习中...2.为公司年会节目做准备,由于许久没有练习双截棍了,难免生疏,所以现在临时抱 ...
- 多级弹出菜单jQuery插件ZoneMenu
ZoneMenu是一个菜单jQuery插件,只需占用页面上的一个小区域,却可以实现多级菜单. 在线体验:http://keleyi.com/jq/zonemenu/ 点击这里下载 完整HTML文件代码 ...
- react引用antd的form表单
引用form是第三方插件ant插件,官网网址:https://ant.design/.用到的antd的版本是@2.0.1.form(https://ant.design/components/form ...
- Web前端开发css基础样式总结
颜色和单位的使用 颜色 用颜色的名字表示颜色,比如:red 用16进制表示演示 比如:#FF0000 用rgb数值表示颜色,rgb(红,绿,蓝),每个值 ...
- Android开发2:事件处理及实现简单的对话框(Toast,AlertDialog,Snackbar,TextInputLayout的使用)
前言 啦啦啦~又要和大家一起学习Android开发啦,博主心里好激动哒~ 在上篇博文中,我们通过线性布局和基础组件的使用,完成了一个简单的学生课外体育积分电子认证系统的界面,本篇博文,将和大家一起熟悉 ...
- iOS --NSAttributedString
字符属性可以应用于 attributed string 的文本中. 文/iOS_成才录(简书作者) 原文链接:http://www.jianshu.com/p/03a741246737 著作权归作者所 ...