C语言总结七:表示字符串的两种方式—字符数组与字符串指针详细总结 C语言并没有专用的字符串数据类型来存储一个字符串,字符串是C语言中重要的一块基本理论,知道如何使用字符串和掌握好字符串可减少实际开发经常出现的错误,本篇博客详细全面总结字符数组与字符串的定义及基本的使用方法,以及常用的库函数和针对内存操作的内存函数。 目录 一、字符数组与字符串 1、字符数组的定义与初始化 2、字符串的定义 3、二者的区别(面试) 二、字符串的访问方式/使用 1、下标引用操作符访问(同整型数组)/或者%s直接输出整个字符串(字符串特有方式) 2、通过指针自增或者指针+偏移量访问 三、字符串的输入 四、字符串转换函数(atoi和itoa函数)编码实现 五、常用的字符处理函数(库函数) 1. int tolower(int c); 2. int toupper(int c); 六、常用字符串处理函数(库函数)理解编码实现 七、内存操作函数,编码实现 一、字符数组与字符串 C语言存储字符,其实是存储字符所对应的ASCII码,因此字符可以以%c或者%d输出均可以,需要作为常识记住的是:字符’0’对应的ASCII码为48,字符’A’对应的ASCII码为65,字符’Z’对应的ASCII码为90,字符’a’对应的ASCII码为97,字符’z’对应的ASCII码为122; 字符类型char占用1个字节。 用来存放字符的数组称为字符数组,字符数组实际上是一系列字符的集合,也就是字符串,C语言通常有两种表示字符串的方法: 第一种:定义一个字符数组;char str[]=”helloworld”; 第二种:字符串指针; const char * str=”helloworld”;字符串指针不可通过解引用进行修改,因为字符串常量不可修改! 这二者从指针角度理解,本质一样,不论是字符数组名,还是字符串指针,字符串名str都代表字符串首素的起始地址。区别在于:字符数组名为常量,常量不可以作左值!字符串指针不可以进行解引用再修改值。 1、字符数组的定义与初始化 字符数组的定义: C语言字符数组定义如下:char 数组名 [数组长度];与普通整型数组相同。只是在初始化方面有所区别。 字符数组的初始化: 方式1:与普通整型数组初始化方式相同,花括号括起来,单个字符用单引号; 第1种:全部素初始化,可以省略字符数组的长度(编译器自动确定)。 char str[5]={‘a’,’b’,’c’,’d’,’e’}; 或者 char str[]={‘a’,’b’,’c’,’d’,’e’}; 第2种:未进行初始化,局部数组声明存储在栈区,此时字符数组的素为随机值。 char str[5]; 第3种:部分素进行初始化,那么未初始化的素默认为默认值’0′ char str[5]={‘a’,’b’,’c’} str[3]=’0′ str[4]=’0′ 方式2:字符数组特有的初始化形式,即C语言规定,可以将字符串(双引号括起来)直接赋值给字符数组; 第1种:char str [6]={“abcde”}; 或者为了简便省略花括号:char str [6]=”abcde”; 需要注意的是:这里的字符数组的长度为6,这是为了存储’0’,因为用双引号” “包围的字符串会在字符串末尾自动添加’0’,因此,当用字符数组存储字符串时,要注意’0’,要为’0’留个位置,这意味着,字符数组的长度至少要比字符串的长度加1。因此为了开发方便,这种方式常常不指定数组的长度。 第2种:char str []=”abcde”;(实际开发常用的方式) 这里有个坑需要注意:字符数组只有在定义的时候,才能将整个字符串一次性地赋值给它。 char str[6]; str =”abcde” ; //错误 字符数组名也是数组名,它是字符数组存储的字符串的首字符的起始地址,是一个常量,无法作为左值!左值必须是变量。 字符串结束标志(重点!!!) 字符串是一系列连续的字符的组合,要想在内存中定位一个字符串,除了要知道它的开头,还要知道它的结尾,找到字符串的开头很容易,知道它的名字(字符数组名或者字符串名)就可以,因为字符数组名或者字符串名都代表首字符的起始地址。那么应该如何找到字符串的结尾? 在C语言中,字符串总是以’0’,作为结尾,所以’0’也被称为字符串结束标志,或者字符串结束符。’0’是ASCII码表中的第0个字符,英文称为NUL,中文称为空字符,该字符即不能显示,也没有控制功能,输出该字符不会有任何效果,它在C语言中的唯一作用就是作为字符串结束标志。0、’0’、NULL、false 都是 0 的表现形式。 C语言在处理字符串时,会从前往后逐个扫描字符,一旦遇到’0’就认为到达了字符串的结尾,就会结束处理,’0’至关重要,没有’0’就意味着永远也到达不了字符串的结尾。 用双引号” “包围的字符串,编译器会隐式的在字符串末尾自动添加’0’,然而通过逐个单引号为字符数组赋值并不会自动添加’0’。 如:char str[]={‘a’,’b’,’c’};数组长度为3。 char str[]=”abc”;数组长度为4。
因此,实际开发会有以下出错点: 程序的逻辑要求必须逐个字符的为字符数组赋值(通常for循环),经常会出现以下问题: 在函数内部定义的变量、数组、结构体、共用体等都成为局部数据,在很多编译器,局部数据的初始值都是随机值,并不是我们通常认为的”零“值,因此本例字符数组定义后,里面存放的是随机值,通过循环赋值后,前26个素已经被赋值为26个英文字母,但是后4个为随机值,不一定是’0’,因此,printf打印完前26个字符后,接下来后面的不一定是’0’,只有遇到’0′,打印才会结束,有可能到了第50个素才是’0’,这已经超出数组的范围了!!但是也会打印出来!因此,如果不注意’0’的后果很严重,不但不能正确处理字符,甚至还会毁坏其他数据! 解决办法: 方式1:在字符串的最后手动添加’0’即可; 方式2:字符数组定义时便进行初始化,将字符数组的所有素都初始化为”零“值;从根本解决问题。(实际开发常用方法:因为一般定义的局部变量都需要进行初始化再使用)
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/53515.html