原创 C语言字符相关部分内容小结

2010-10-9 10:31 996 4 4 分类: MCU/ 嵌入式

 


作者:李慧芹,华清远见嵌入式学院讲师。


很多初涉编程的同学,在有些知识点上不够系统化或者说不能够将知识点联系起来,甚至对有些知识点有妖魔化的趋势,先说一下,这点是完全没有必要的,对于程序的编写,我个人认为这是一件很有美感的事情,所以不必预先给自己太大的心理压力去进行这方面的学习与工作。


今天就字符部分相关的一些知识点作一个小结。


一、 字符及由字符构造出来的一些类型的概念和特点


a) 字符:字符是由单引号引起来的单个的字符或转义字符。


b) 字符串:字符串是由双绰号引起来的N个字符序列,这里的N可以是1个,可以是多个,也可以为0,也就是一个空串。


概念的理解很重要,是区分不同类型的基准。


二、 存储


字符的存储实质上存储的是其相应的ANCII码。


而ANCII码分为三部分,第一部分共32个,一般且来通讯或作为控制之用,有些可以显示于屏幕上,有些则无法直接显示在屏幕上,但能看到其效果;第二部分共96个,用来表示阿拉伯数字、英文字母大小写及底线括号等符号;第三部分共128个,为扩充字符,用来表示框线、音标及其他非英语系的字母。


由上述可见,字符类型的特殊性在于任何的操作及控制如果放在字符类型中都是有效的录入,意味着要进行字符类相关操作的时候要进行更加细心和周全的考虑和控制。


基本类型中并没有字符串类型,需要我们自行去构造,所以对于字符串的存储我们需要借助于数组,也就是利用字符数组去存储字符串。若以字符串常量的方式给一个字符数组赋值,如char str[]=”hello”,则系统在进行存储时,存储’h’,’e’,’l’,’l’,’o’这五个字符外,会多开辟一个空间存储’\0’,用以作为一个串的结束标志,这也是我们通常在对一个串进行操作时所利用的结束条件。


三、 输入与输出


字符的输入与输出可以使用标准输入输出函数scanf(),printf(),利用上述函数中的%c格式进行输入与输出,还可以利用针对字符的输入输出函数putchar(),getchar()。


字符数组部分的输入与输出可以分两种方式:一种是采用单个字符方式,即把字符串中的每个元素都看作一个字符,进行单个输入或输出,可以借助上述字符的输入与输出,这里就需要用到循环来进行单个字符的控制,或者采用标准输入输出中的%s针对字符串进行操作;另外可以使用专门针对字符串的输入输出函数gets(),puts()。


注意:1)在字符的操作中,刚刚解释过了任何的输入及控制都会被当作有效的字符录入,所以如果控制不周全,则在终端上进行的回车,TAB键等等的操作都会当作有效的录入,这也就需要我们在对程序进行控制的时候注意该方面的问题。


2)对于字符串部分如果采用使用单个字符赋值的方式,如char str[5]={’h’,’e’,’l’,’l’,’o’},系统会存储五个字符,这时在控制输出时若用scanf的%s格式进行控制,或用puts进行控制输出的话会出现输出乱码的情况,原因是由于上述两种方式作输出时,会从字符数组的起始地址开始,一直向后输出,直到遇到结束标志’\0’为止,所以在上述赋值方式中会出错。若使用循环控制5次输出,每次输出单个字符,则不会出错。


也就是说程序有时无法获得预想的效果,不一定是逻辑和语法的问题,也可能是前后的控制不到位而出现输出的差错。


另外scanf中的%s格式遇空格或回车时结束,若有如下部分程序段:


int main()
        {char a[15];
        scanf("%s",a,b,c);
        puts(a);
        ……
        }


若终端输入为how are you,则a串只能获得how。


四、字符数组部分相关函数


字符数组部分相关字符函数简单说一下:


1、strlen(str1):返回值为字符串的实际长度,这个实际长度是不包含’\0’的,区别于sizeof,其测量的为字符数组在内在中实际所占的字节数。
        2、 strcat(str1,str2):连接两个字符串,实现过程:str1的’\0’取消,str2连接进去,最后加一个’\0’作为结束标志。
        3、 strcpy(str1,str2):将str2拷贝到str1中去,前提条件str1必须足够大,拷贝时将’\0’一同拷贝,在此强调,字符串的赋值不能采用普通变量式,即str2 = str1写法是错误的,必须使用函数进行两个字符串的拷贝。
        4、 strcmp(str1,str2):将str1与str2中的字符进行逐个比较,直到碰到不同的字符或’\0’为止,哪个的ANSII码值大就判断为哪个字符串较大,返回值为正值负值和0来表示两个串的大小关系,即若对两个字符串需要进行判断时 if(str > str)写法是错误的。


另外需要注意的是:上述函数的代码实现的考察也是在进行一些技术面试时常会遇到的问题。


考察以下几点:字符串要以’\0’作为结尾;对数组越界把握的敏感程度;对项目整体的控制细节如参数的传递,形参的设置及返回值的设置。


看一个例题,有一定的代表性,题目本身并不难,但如果字符相关内容不太熟悉或对标志性变量不熟悉,可以以此例为着手点。


从终端输入一行字符,统计其中单词个数。(该问题主要练习标志性变量的使用,另外如果该问题用单个字符来进行实现也可以,但会走一些弯路,算法及实现上并不简便,所以我们在这里用字符串来进行解决),示例代码如下:


int main()
      {         char string[80];
                int i,num = 0 ,word = 0;        //num为计数变量,word为标志性变量
                char c;
                gets(string);        //从终端输入字符串
                for(i = 0 ; (c = string) != '\0' ; i++)        //依次遍历串中的每个字符,直到'\0'为止
                {       if(c == ' ')        //若当前遍历的字符为空格
                                word = 0;         //标志变量清0
                        else
                                if(word == 0)         //当前字符不为空格且若标志变量为0则表示前面遍历完一个单词,则计数+1,标志变量置1
                                {       word = 1;
                                        num ++;
                                }
                }
                printf("The total is %d\n",num);
                return 0;
        }

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条