China Open source community
站内导航:
站内排行前50热点文章

精华文章  GDB调试精粹及使用实例
普通文章  STL中map用法详解
精华文章  负载均衡软件比较(Hapr...
普通文章  头文件的重复引用
普通文章  递归函数的调用过程
普通文章  TCP三次握手/四次挥手详解
普通文章  贪心策略的理论基础——...
普通文章  BMH算法原理与实现(模...
普通文章  排列组合与回溯算法
普通文章  DP动态规划
精华文章  Android线程模型
普通文章  Linux socket编程之套接字
普通文章  Linux内核中的红黑树
精华文章  linux下使用minicom的几...
普通文章  Java开源Html解析类库
精华文章  enum类型的本质
普通文章  memcached server LRU ...
普通文章  linux设置环境变量的方法
普通文章  android核心模块及相关...
普通文章  linux源代码包(.tar.g...
普通文章  L.A.M.P配置过程
普通文章  在ubuntu9.10下安装QT4...
普通文章  C/C++程序员常见面试题...
普通文章  gcc编译过程概述
普通文章  python的memcache和jso...
普通文章  应用程序二进制接口---ABI
普通文章  linux内核编译问题
普通文章  Java多线程实现简单实例
普通文章  Python程序员常用的IDE...
普通文章  brk和sbrk详述
普通文章  优化C语言代码(程序员必...
普通文章  python非贪婪,多行匹配...
普通文章  函数指针传递和全局指针...
普通文章  Unix操作系统的历史演变
普通文章  网络编程之C10K问题
普通文章  发行版发布:CentOS 5.4
普通文章  在windows中构建gtk开发...
普通文章  i++循环与i--循环的执行...
普通文章  关于Qvariant类--万能的...
普通文章  Debian sudo 设置
普通文章  busybox1.15.x 交叉编译
普通文章  关于僵死进程zombie
普通文章  递归思想的妙用
普通文章  判断链表是否存在环并找...
普通文章  Android Porting Exper...
普通文章  关于/etc/bashrc和$HOM...
普通文章  [翻译]Django初窥
普通文章  Python list的排序
普通文章  Django实现大数据量分页...
普通文章  Debug方式取代printf满...

 
 
 
当前位置: 首页 >> 程序设计 >> C/C++编程 >> C语言中字符变量字符串和字符数组应用
 
 

C语言中字符变量字符串和字符数组应用

作者:      来源:zz     发表时间:2006-08-14     浏览次数:      字号:    

字符变量(type`char`?字符串(string)和字符数组(type`char`arrary)是C语言中非常重要的结构成分,也是应用编程中常发生混淆?导致错误发生的成分?一?注意区别字符数组中的字符和字符串C语言中无字符串变量,但提供了字符数组character arrary)   
用于存储字符串,例如:  
char str[]="Hello";  
同时,字符数组亦用于存储字符或字符变量,例如:  
/*存放字符例*/  
char Chars[]={`H``e`,`1``1`,`o`};  
/*存放字符变量例*/  
char ch=getch();  
char CharVar[]=ch;  
str和Chars的内容尽管由相同字母构成,但前者是字符串(str)后者为一列字符(Chars)?两者在内存中的结构不同,即字符串结尾有NULL 0(字符串终止符)?在应用编程实践中,常常需要从键盘获取字符,依次存入字符数组中,再以字符串输出函数输出到屏幕等,譬如,在中文环境?图形模式下中文字符的键盘输入和屏幕显示?如混淆字符数组中字符组与字符串的差别,则可能得到奇怪的结果?如例:  
CharStr()  
{ int i,CharNum=5;  
unsigned char str[80];  
for(i=0;istr[i]=getch();/*给数组str赋字符值*/  
printf("Output string is:%s",str);/*输出错误*  
/  
}  
此段程序码在编译器(BorlandC 3.1)可顺利通过,无错误或警告显示,但结果输出不正确,因为数组str内为字符组而非字符串,当用于字符串函数操作时,因未能遭遇字符串终止符(NULL),printf将str[4]以后的空字节也作为字符串的一部分处理,导致屏幕输出不正确?解决办法是在字符组末尾加NULL字符(’\0’),转换此字符数组内的字符组为字符串,重写前述程序码为:  
CharStr()  
{ int i, CharNum=5;  
unsigned char str[80];  
for(i=0;istr[i]=getch();/*给数组str赋字符值*/  
str[5]=`\0’;/*加NULL,转换为字符串*/  
printf("Output string is:%s",str);}  
现在结果输出显示正常?  
二?为函数strcat等字符串处理函数的目的字符串分配内存空间Borland C(Turbo C)和Microsoft C的strca等函数是常用的字符串操作函数,切记在使用前先为其目的字符串分配合适的内存空间,否则将可能发生乎意料的错误?下面的程序码在编译器或许通过顺利,但可能产生错误的结果:  
ConcatStr(char *str)  
{ char* ptr;  
char*ptr=strcat("hello",str);/*错误!*/  
printf("New string=%s",ptr);  
return;}  
问题源于没有为字符串指针ptr指向的字符串"Hello"分配内存空间?函数strcat(char *dist,char *src)返回*dist的地址,  
因此,*dist必须指向一个适当大小的内存缓冲区(安全的大小应>=dist+stc+1)下面是正确的程序码:  
ConcatStr(void)  
{char buffer[80]; /*静态分配一内存缓冲区给buffer*  
/  
strcpy(buffer,"Hello"); /*拷贝字符串"Hello"到b  
uffer缓冲区*/  
strcat(buffer,"World"); /*链接字符串"friends"到  
buffer缓冲区*/  
printf("New string=%s",buffer);  
return;}  
三?正确应用字符变量类型char的singed和unsigned前缀假如说明一个字符变量类型为char,多数编译器会缺省地将其视  
为signed?若此字符变量只用于存放字符,即使是ASCII序数在128-255的字符,亦不会有问题发生?但若将此变量用于与整型数比较,或作为一个数组的索引序号,则可能会发生问题:  
IndxChar(void)  
{int i;  
char ch,outch; /*缺省为signed*/  
char Indx[255];  
for(i=0;i<255;i++)  
Indx[i]=i;  
ch=getchar();  
if(ch>127 &&ch<255)/*与>127的整型数比较,结果非  
true*/  
outch=Indx[ch]; /*错误!作为数组的索引*/  
outch=`\x40’; /*如果非ture,则给 outch赋@值*/  
printf("output character=%c",outch);  
return;}  
上述程序码将总是输出字符@(ASCII 64)?因为signed char类型赋值范围是0-127,超出此范围的字符(128-255),计算机视其  
为负数,所以if判断句的结果总是Fail?正确的做法是把字符变量ch说明为unsigned,重写上面的程序码: 

IndxChar(void)
{ int i;
unsigned char ch; /*说明字符变量ch为unsigned*/
char outch;
char Indx[255];
for(i=0;i<255;i++)
Indx[i]=i;
ch=getchar();
if(ch>127&&ch<255) /*OK!*/
outch=Indx[ch]; /*OK!*/
outch=`\x40’;
printf("output character%c",outch);
return;}
现在编译过程中不会再有警告或错误信息,输出结果亦正常?补充一点,只须将作为对象的字符变量ch说明为unsigned,对字
符变量outch不必一定做如此处理? 



原作者: 陶勇浩 
来 源: 成都

编辑 webmaster

 
 
 
 
中国源码网 - www.YuanMa.org - 中国 开放源代码+编程 社区