C

C 知识量:16 - 74 - 317

4.1 字符串><

字符串简介- 4.1.1 -

字符串是一个或多个字符的序列,例如“Hello world!”。其中,双引号不是字符串的组成部分,它的作用仅是告诉编译器括起来的是字符串。

应当区别于单引号,单引号用于表示字符,与字符串不是一个概念。

char类型数组和空字符- 4.1.2 -

在C语言中没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中。这个数组由连续的存储单元组成,每个单元存储一个字符,但需要注意的是,在存储字符串的数组末尾位置会以一个“\0”字符结束。例如:字符串“hello pnotes”存储到数组中应为:

IMG_00340.png

空字符“\0”不是数字0,它是非打印字符,其ASCII码值是0。

数组就是连续的多个存储单元,可以想象为上面示例中连续的单元格,只不过一旦定义了某种类型的数组,该数组的每个存储单元的数据类型必须是一样的。定义char类型的数组方式如下:

char name[20];

以上定义了一个用于存储字符串的char类型数组,数组名为“name”。数组name由20个连续的存储单元构成,可以存储一个长度为19的字符串(最后一个存储单元要留给“\0”)。

使用字符串- 4.1.3 -

以下是一个简单的字符串应用示例:

#include <stdio.h>

int main(void) {
	/*根据输入的人名打招呼*/
	char name[20];
	printf("What is your name?");
	scanf("%s", name);
	printf("Good morning %s!", name);
	return 0;
}

运行的结果为:

What is your name?Jeff
Good morning Jeff!

其中,Jeff是输入的人名。控制台应用程序会首先打印“What is your name?”,然后等待输入,输入人名(Jeff)并回车后,程序会打印“Good morning Jeff!”。

以上代码中,定义了char类型数组name,它最多可以容纳19个字符。scanf()函数是一个输入函数,会在数组末尾自动加上一个\0。%s表明输入和打印的是一个字符串。

strlen()函数- 4.1.4 -

在C语言中,sizeof运算符会以字节为单位给出对象的大小(或称长度)。还有一种函数可以测量对象的长度,那就是strlen()函数。strlen()函数通常用于字符串,它可以给出字符串的实际长度。

下面通过一个示例来对比一下sizeof运算符和strlen()函数。

#include <stdio.h>
#include <string.h>

int main(void) {
	/*输入人名*/
	char name[20];
	printf("What is your name?");
	scanf("%s", name);
	printf("Good morning %s!\n", name);
	/*显示sizeof与strlen的区别*/
	printf("Your name is %zd letters.(sizeof)\n", sizeof(name));
	printf("Your name is %zd letters.(strlen)", strlen(name));
	system("pause");
	return 0;
}

以上代码的运行结果为:

What is your name?Jeff
Good morning Jeff!
Your name is 20 letters.(sizeof)
Your name is 4 letters.(strlen)

运行时输入的人名是“Jeff”,当使用sizeof运算符检测时,name的长度是20;而使用strlen()函数检测时,name的长度是4。可见,sizeof运算符计算的是变量的存储空间大小,而strlen()函数计算的是变量实际存储的字符长度。

在以上代码中,stdio.h和string.h都称为头文件。通常,C把函数库中功能相关的函数归为一类,并为每类函数提供一个头文件。头文件中包含了某类函数的定义和声明,将头文件以#include的语法包含到程序中后,就可以在程序中使用该头文件中定义的函数了。例如,stdio.h中包含了printf()和scanf()函数;string.h中包含了strlen()函数等。

代码中需要注意的是:

  • sizeof运算符返回类型用%zd转换说明进行解释,这同样适用于strlen()函数。但是,如果编译器不能支持C99或更新的标准,则应当使用%u、%lu或%d。

  • sizeof运算符后面如果是类型,则必须使用圆括号,例如:sizeof(char)。如果后面是特定量,则可以省略圆括号,例如以上示例中可以写作:sizeof name。但是建议一直使用圆括号。

  • \n在printf()语句中表示换行。

  • 代码中的system("pause")用于运行时暂停,以方便查看运行结果,如果不添加该语句,运行结果会一闪而过。