黑马程序员——C语言学习笔记04 字符、数组和字符串的一些要点。

来源:互联网 发布:镜像变换 矩阵理论 编辑:程序博客网 时间:2024/05/16 10:11

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


1、char 字符

a.小写字母的ASCII码比它的大写字母的ASCII码大32

b.字符的ASCII码,就是它们在内存中存储的二进制数对应的10进制数。

c.char类型可以通过输出整型%d的方式输出它的ASCII码。

d.同样的可以把ASCII码范围内的整数通过%c占位符来输出成字符。

e.可以使用字符直接与整数相加,来变成其他字符 比如 'A' + 33 == B;

f.在当前的编译环境下(osx)下,中文一个汉字占3个字节。不能存储在char中。

g.switch里的case不可以是相同的条件,比如判断字符'A' case的条件不可以是'A'和 65同时出现。因为A的ASCII码是65.

h.char还可以当做整型来用,但是不要再-128 ~ 127范围内,ASCII码的范围是0 ~ 127。

2、数组

a.格式:
数据类  型数组名[元素个数]

b.赋值方式:
1、单个赋值  a[0] = 10;
2、整体赋值(初始化)  int a[2] = {1,2};(整体赋值只能在初始化时使用)。

c.遍历数组
利用循环

d.初始化
只能在定义数组的同时进行初始化
int a[5] = {1,2,3,4,5};
int b[5] = {1,2};(值赋值了0.1两个元素,后面3个都是0)
int c[10] = {[2] = 10, [8] = 55};(只给2和8两个元素赋值,其他都为0)
int d[] = {1,2,3,4};(该数组长度为4)

e.注意点:
1、单独 int a[];这样写是不对的。无法分配内存给数组。
2、int a[5];
      a = {1,2,3,4,5}; (这样写是错误的,首先数组名是数组首字符的地址,a == &a[0],其次整体赋值只有在定义数组时使用,之后不可使用)
3、int a['A'] = {1,2,3,4,5};(这样写是没错的,代表这个数组长度是65)
4、int count = 4;
      int a[count] = {1,2,3,4};(这样写是错误的,初始化数组时,数组的元素个数只能是一个常量,、常量表达式或不写,不能是变量)
5、int count = 4;
      int a[count];
      a[0] = 1;
      a[1] = 2;(先定义变量,在定义数组,然后在一一赋值,这样是可以的。但要给数组一一赋值,否则数组的每个值会是任何值。)

f.获取数组元素的个数
利用sizeof来判断数组元素的个数。
假设已经初始化了一个整型数组a
int count = sizeof(a) / sizeof(int);
(注意,这个方法不能用在函数中来判断参数的长度,因为数组作为参数,实际上就是一个指针,sizeof(指针)结果是指针所占的字节数。)

g.数组在内存中的存储
和变量一样,分配内存时都是从大到小,数组元素在分配的控件中从低地址向高地址排列。但是注意数组的数据类型,int型,每个元素占4个字节,char型,每个元素1个字节。

h.数组或数组名作为函数参数传递的是地址。数组元素作为函数参数传递的是值。

3、字符串

C语言的字符串是由一堆有序的字符串组成的数组,以字符'\0'作为结尾。

a. char s1[8] = "it";占用8个字节的内存空间,但是只使用了3个字节,'i','t','\0'

b. char s2[8] = {'i','t','\0'};也是一个字符串

c. char s3[8] = {'i','t',0};也是一个字符串

d. char s4[8] = {'i','t'} 也可以作为一个字符串用,因为它后面6个都是0,但不推荐这么做。

e. char s5[] = {'i', 't'};不是一个字符串,因为它只有2个元素,字符串结尾需要'\0'结尾。

f. char s6[] = "haha";sizeof(s6) 的结果是5,因为有一个隐藏的'\0'字符。

g. 把不带'\0‘的字符数组当做一个字符串输出,后果会很严重,会把它和它后面内存的东西一块输出。因为%s会从数组的地址开始,一个一个字符输出,直到遇到'\0'结束。

h. 字符串常用的函数

int strcmp(constchar *,const char *);

这个函数比较的是字符串,不是数组。用于比较字符串,不是字符。

strcmp(s1,s2);

如果s1 >s2那么返回值 > 0

如果s1 = s2那么返回值 == 0

如果s1 <s2那么返回值 < 0

 

int strncmp(constchar *,constchar *, size_t);

strcmp函数比较字符串时,一直比较找到不同的响应字符,搜索可能要进行到字符串结尾处。

strncmp()函数比较字符时,可以比较到字符串的不同处,也可以比较完由第三个参数指定的字符数。

 

 

char *strcpy(char*,constchar*);

strcpy(s1,s2);

拷贝s2字符串的内容到s1中。

strcpy()接受两个字符串指针参数。指向最初字符串的第二个指针可以是一个已声明的指针、数组名或字符串常量。指向复制字符串的第一个指针应指向控件大到足够容纳该字符串的数据对象,不如数组。

strcpy()它的返回值是一第一个参数的值,即一个字符的地址;其次,第一个参数不需要指向数组的开始,这样就可以复制数组的一部分。

 

char *strncpy(char*,constchar*, size_t);

strcpy()不检查目标字符串是否容纳的下源字符串。所以使用strncpy()比较安全。它需要第三个参数来致命最大可复制的字符数

 

 

 

char *strcat(char*,constchar*);

strcat(s1,s2);

它将第二个字符串的一份拷贝添加到第一个字符串的结尾。函数返回它的第一个参数的值,即其后添加了第二个字符串的那个字符串中第一个字符的地址。

strcat()函数并不检查第一个数组是否能够容纳第二个字符串。如果没有为第一个数组分配足够大得空间,多出来的字符溢出到相邻存储单元时就会出现问题。这时候可以使用strncat()函数。

 

char *strncat(char*,constchar*, size_t);

这个函数需要另一个参数赖志明最多允许添加的字符的数目。

例如:

strncat(s1,s2,10);

s2字符串中的内容添加到s1上,知道加到第10个字符或遇到空字符为止。

 

size_t strlen(constchar *);

strlen()可以获得字符串的长度,不包括'\0'


0 0