学习过C语言的人也许有时会遇到这样一个问题:如何用变量存储汉字以及对这些变量进行操作。目前许多C语言参考书中都没涉及到这个问题,程序中多为处理英文变量和英文字符串,涉及到汉字的情况也大都是在printf语句中输出提示信息或结果,如:

  1. printf("请输入a,b的值:\n");
  2. printf("输出功率为%s千瓦。\n",power);

复制代码

考虑到还有相当一部分人在学习和应用C语言,因此在这里向读者介绍一下笔者在这方面摸索出来的经验。

  存储汉字应该用字符数组,这一点是肯定的,关键问题是汉字在你的计算机系统上占几个字节。多数人会认为一个汉字肯定占两个字节,其实不然。汉字到底占几个字节,这是随系统不同而不同的,而且还依赖于软件环境,如Visual Basic中汉字占一个字节。可以在你的计算机上用strlen()函数测试一下,如:

  1. printf("%d",strlen("计算机"));

复制代码

若输出为6,则每个汉字占两个字节;若输出12,则每个汉字占四个字节。大多数系统是每个汉字占两个字节的,即上述语句输出值为6。应当注意的是一个全角字符(包括标点符号)同汉字占据相同的字节。本文假定每个汉字占两个字节。

  这样你就可以用字符数组存储汉字了,但别忘了,由于C语言中字符串是以'\0'作为结束标记的,系统会自动加上这个标记符,而用strlen()函数测试的返回值不包括这个'\0',因此在定义和初始化字符数组时应当使数组长度最小为实际字符串长再加1,如:

  1. static char name[7]="孙悟空"; /*数组长度为7说明最多可存放3个汉字*/

复制代码

如果把数组长度定义为6,系统在编译时并不报错,但是当运行程序时有时会莫名其妙地重复输出或多输出汉字,如果出现这种情况,应当首先考虑数组长度是否有问题。当然在定义的同时初始化可以省略数组长度,如:

  1. static char array[]={"中国计算机软件专业技术水平考试"};

复制代码

同样可以定义二维数组,下面这个二维数组可以存放10个人名:

  1. 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程序最好在全屏幕状态,否则容易出现问题。

  下面给出一个实例程序,它的功能是计算出输入年份的天干地支。

  1. #include "string.h"
  2. main()
  3. {
  4. int a,b,year;
  5. char gz[6]; /*用来表示干支的字符变量*/
  6. /*注意:下面两个语句中{}内的引号和逗号不能为全角字符*/
  7. static char tg[10][3]={"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
  8. static char dz[12][3]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戍","亥"};
  9. printf("请输入一个年份:");
  10. scanf("%d",&year);
  11. a=(year-1804)%10; /*以1804年为参考年份,1804年是甲子年*/
  12. b=(year-1804)%12;
  13. strcpy(gz,tg[a]);
  14. strcat(gz,dz[b]);
  15. printf("%d年的干支为:%s\n",year,gz);
  16. }

复制代码

运行结果:
请输入一个年份:1999
1999年的干支为:己卯

[zz]如何在C语言程序中处理汉字的更多相关文章

  1. 如何在Android应用程序中使用传感器模拟器SensorSimulator

    原文地址; 如何在Android应用程序中使用传感器模拟器 - 移动平台应用软件开发技术 - 博客频道 - CSDN.NET http://blog.csdn.net/pku_android/arti ...

  2. 转:如何在32位程序中突破地址空间4G的限制

    //如何在32位程序中突破地址空间4G的限制 //首先要获得内存中锁定页的权限 #define _WIN32_WINNT 0x0501 //xp系统 #include <windows.h> ...

  3. 如何在Silverlight应用程序中获取ASP.NET页面参数

    asp.net Silverlight应用程序中获取载体aspx页面参数 有时候SL应用中需要使用由aspx页面中传递过来的参数值,此时通常有两种方法获取 1. 使用InitParameters属性, ...

  4. C++虚函数作用原理(一)——虚函数如何在C++语言逻辑中存在

    C++多态,接触其实也没太长的时间.上课的时候老师总是不停的讲,多态可以实现利用一个基类对象调用不同继承类的成员函数.我就会觉得很伤脑筋,这个的原理到底是什么?是什么呢? 开始的时候我觉得自己应该能够 ...

  5. 如何在Android应用程序中使用传感器(OpenIntents开源组织SensorSimulator项目)

    原文地址http://blog.sina.com.cn/s/blog_621c16b101013ygl.html OpenIntents项目和可用资源介绍 [1].    项目介绍:OpenInten ...

  6. 如何在WPF应用程序中使用视频处理控件TVideoGrabber

    要在WPF 中使用 TVideoGrabber 组件,需要像下面的方法来使用 VS.NET(DLL) 版本的组件: ——复制TVideoGrabber_x.x.x.x_x86.dll到c:/windo ...

  7. [Prism框架实用分享]如何在Prism应用程序中使用日志

    前言 在Prism中有关日志的命名空间: Microsoft.Practices.Prism.Logging 在Prism中,你可以使用Prism自带的Logger(比如TextLogger等),也可 ...

  8. 示例 - 如何在Console应用程序中应用SpiderStudio生成的DLL?

    以前面生成的XML/JSON互转DLL为例, 我们写一个Console Appliction来做这件事情, 步骤如下: 1. 创建Console Project 2. 引入www.utilities_ ...

  9. 如何在Qt 4程序中优化布局结构(表格讲解,很清楚)

    原文地址:http://blog.csdn.net/qter_wd007/archive/2010/03/13/5377882.aspx 在迄今为止讲到每一个例子中,我们只是简单的把窗口部件放置到某个 ...

随机推荐

  1. onclick标签变成小手状

    style=“cursor: pointer;”

  2. jquery移除属性值

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. SSH整合(struts2.3.24+hibernate3.6.10+spring4.3.2+mysql5.5+myeclipse8.5+tomcat6+jdk1.6)

    终于开始了ssh的整合,虽然现在比较推崇的是,ssm(springmvc+spring+mybatis)这种框架搭配确实比ssh有吸引力,因为一方面springmvc本身就是遵循spring标准,所以 ...

  4. S1的小成果:MyKTV系统

    转眼之间,已经到了2016年,即新的一年了!S1也结束了,收获的也不多 ,想想最后留给大家的就一个KTV项目了. 希望大家看时有所收获           现在我们一起来看KTV前台管理 主界面的运行 ...

  5. JAVA的POI操作Excel

    1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组 ...

  6. Lua-面向对象中类的构造

    在Lua中,我们可以通过table+function来模拟实现类. 而要模拟出类,元表(metatable)和__index元方法是必不可少的. 为一个表设置元表的方法: table = {} met ...

  7. Linux vi/vim(转载)

    Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主 ...

  8. SharePoint 2013 Search 配置总结

    前言:SharePoint 2013集成了Fast搜索以后,搜索的配置有了些许改变,自己在配置过程中,也记录下了一些入门的东西,希望能够对大家有所帮助. 1.配置搜索服务,首先需要启用搜索功能,基本思 ...

  9. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q128-Q130)

    Question  128 You are designing a SharePoint 2010 solution that includes a custom site definition an ...

  10. Runtime相关整理

    一.Runtime是用C和汇编写的 对于C语言,函数的调用在编译的时候会决定调用哪个函数.对于OC的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名 ...