C语言基础

    返回首页    发表留言
本文作者:李德强
          第二节 字符数组与字符串
 
 

        在本节中我们来学习关于字符数组和字符串的相关知识。我们知道定义一个数组时需要为其指定相应的变量类型。也就是说,定义了数组的类型之后这个数组中的所有变量就都是相同的类型。现在我们就来定义一个字符弄型的数组,如下:

char hello[5] = {'H','e','l','l','o'};

        这样我们就定义了一个字符型的数组,对于数组型的变量这样定义是没有问题的,但有两个方面的不足:

1·定义的过程比较麻烦,在数组变量初始化时需要逐个写出每一个字符,并在这每一个字符的两端加上一对单引号。

2.在显示字符数组时,我们通常希望能够让其一次性的显示出来,而不是通过循环数组的方式逐个显示这些字符。

        例如上面定义的数组我们想要用printf将其显示出来我们则需要通过循环的方式:

char hello[5] = {'H','e','l','l','o'};
for (int i = 0; i < 5; i++)
{
	printf("%c", hello[i]);
}

Hello

        其实,在C语言中支持直接定义字符串的方式来为定义字符数组,例如:

char hello[6] = "Hello";
printf("%s", hello);

Hello

        注意,我们在定义这个数组时,指定数组的大小为6,也就是说需要申请6个字节的存储空间,而在等号右侧的双引号中我们却只书写了5个字符。这并不是笔误,C语言规定当使用双引号定义字符串时以'\0'作为这个字符串的结束标志符,也就是说这个字符串一共有6个字符,分别是'H'、'e'、'l'、'l'、'o'、'\0'。关于\0读者只需要知道这是一个特殊的字符即可,它表示字符串的结束,它的值为0。这样我们就可以通过printf函数将这个字符串直接打印出来。需要注意的是,当使用printf来显示字符串时,我们要确保这个字符串变量中最后一个结束字符为\0,如果结束字符不是\0则printf在显示这个字符串时,就不知道显示到何处结束,例如

char hello[5] = "Hello";
printf("%s", hello);

Hello#@($0948#."

        也就是说,我们虽然定义了一个字符串,但只定义了5个字符的长度,而使用双引号为其初始化时,这个字符串的实际大小应该是6因为要追加一个\0,但我们在定义数组大小时只指定其大小是5所以这个数组中的中只有5个元素分别是'H'、'e'、'l'、'l'、'o'。而在'o'之后并没有'\0',所以在printf显示这个字符串时,显示 Hello之后,并不知道何时结束,所以就会继续显示,直到遇到一个'\0'为止,于是我们程序就出现了非预期的结果。这样的程序并不是我们提倡的,我们在定义字符串时一定要为其多分配一个字符的长度,以便存放字符串的结束符'\0'。当然,使用双引号定义的字符串可以像使用普通数组一样使用其数组元素例如ABC运行结果可以看到直接显示字符串和循环显示字符数组中的元素的效果是一样的。

char str[6] = "Hello";
printf("%s\n", str);

for (int i = 0; i < sizeof(str); i++)
{
    printf("%c", str[i]);

}
printf("\n");

Hello
Hello

        在这里我们使用了另一个重要函数sizeof(),它的作用是可以计算出某一个变量或类型的大小,就是占用的内存字节数,例如:

char ch;
short sh;
int i;
printf("%d %d %d %d %d\n", 
        sizeof(ch), 
        sizeof(sh), 
        sizeof(i), 
        sizeof(long), 
        sizeof(long long));

1 2 4 8 8

        请注意,long类型的变量在不同的操作系统下占用字节数可能不同,请参数参见《变量大小》。另外在使用sizeof来计算数组大小时,计算的是数组一共占用内存的字节数,而不是数组的元素元素的个数,例如:

int array[4];
printf("%d\n", sizeof(array));

        上面例子的结果是16而不是4。

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2018 问渠网 辽ICP备15013245号