4.8 C++语言的系统函数
C++语言的编译系统提供了几百个函数供编程者调用。本节将介绍使用系统函数的方法,并且讲述字符串类的系统函数。
4.8.1 C++语言系统函数概述
C++语言系统将所提供的系统函数的说明分类放在不同的头文件(.h文件)中。例如:
- 有关数学常用函数(如指数函数、对数函数、绝对值函数、立方根函数和三角函数及反三角函数等)放在
math.h
文件中。 - 判断字母、数字、大写字母、小写字母等的函数放在
ctype.h
文件中。 - 有关字符串处理的函数放在
string.h
文件中。 - 屏幕处理函数放在
conio.h
中。 - 图形处理函数放在
graph.h
中。
编程者在使用系统函数时,应该注意如下几点:
-
了解所使用的C++语言系统提供了哪些系统函数:不同的C++语言编译系统所提供的系统函数不同,同一种C++语言编译系统的不同版本所提供的系统函数的多少也不尽相同。只有了解系统所提供的系统函数后,才能根据需要进行选用。了解某个C++语言系统所提供的系统函数的方法是阅读该编译系统的使用手册,手册中会给出各种系统函数的功能、函数的参数和返回值以及函数的使用方法。另外,也可以通过联机帮助系统了解一些系统函数的简单情况。
-
知道某个系统函数说明在哪个头文件中:要调用某个系统函数,必须将该系统函数的说明所在的头文件包含在调用的程序中,否则连接不上,将报连接错。例如,要使用
sqrt()
函数求某个数的平方根时,就需要在程序中,将math.h
头文件包含进去。math.h
中有关于sqrt()
函数的原型说明,如下所示:double sqrt(double);
该原型说明将告诉你
sqrt()
的使用方法。即要求一个double
型的参数,将对该参数值求平方根,并且返回一个double
型的数。在使用时,应将该函数的返回值赋给一个double
型的变量,否则需要进行强制类型转换。不然的话,可能出现类型不匹配的警告错。 -
调用一个函数时,一定要将该函数的功能、参数和返回值搞清楚:否则难以正确使用这个函数。
例4.25 编程求出30°角的正弦值、余弦值和正切值。程序如下:
#include <iostream.h>
#include <math.h>
const double pi = 3.14159265;
void main() {
double i = 30 * pi / 180;
double x = sin(i);
double y = cos(i);
double z = tan(i);
cout << "sin(30) = " << x << endl;
cout << "cos(30) = " << y << endl;
cout << "tan(30) = " << z << endl;
}
执行该程序输出结果如下:
sin(30) = 0.5
cos(30) = 0.866025
tan(30) = 0.57735
该程序中,调用了包含在math.h
中的三个函数sin()
、cos()
和tan()
。这三个函数的原型说明如下:
double sin(double x);
double cos(double x);
double tan(double x);
其中,x
是弧度值。1° = π/180弧度。
4.8.2 字符串处理函数
字符串处理函数放在string.h
头文件中,调用字符串处理函数时,要包含该头文件。下面列举一些常用的字符串处理函数的功能、原型及其使用方法。
1. 字符串长度函数strlen()
该函数的功能是返回一个字符串的长度。该函数原型说明如下:
int strlen(const char *s);
该函数将计算字符指针s
所指向的字符串的长度,即字符串中包含的有效字符的个数,空字符不计算在内。
例4.26 计算已知字符串的长度。程序内容如下:
#include <iostream.h>
#include <string.h>
void main() {
char s1[] = "abc mnp";
char *s2 = "hello!";
char s3[80];
cout << "Input a word: ";
cin >> s3;
cout << "s1: " << strlen(s1) << endl;
cout << "s2: " << strlen(s2) << endl;
cout << "s3: " << strlen(s3) << endl;
cout << strlen("iostream.h") << endl;
}
执行该程序时,显示如下信息:
Input a word: programming
输出结果如下:
s1: 7
s2: 6
s3: 11
11
说明:该程序中4次调用求字符串长度函数strlen()
。每次调用时给定参数的方法是不同的,有字符数组名、字符指针名,还有字符串常量。
2. 字符串复制函数strcpy()
该函数的功能是用一个字符串去更新另一个字符串,进而实现字符串的复制。该函数原型说明如下:
char *strcpy(char *s1, const char *s2);
其中,s1
和s2
是字符指针或者字符数组,而s2
的字符串是已知的。该函数将s2
所指向的字符串复制到s1
所指向的字符数组中。然后返回s1
的地址值。该函数是一个指针函数,因为它的返回值是一个指向char
型的指针。调用这个函数时,请注意:必须保证s1
所指向的对象能够容纳下s2
所指向的字符串,否则将出现数据混乱。
例4.27 使用字符串复制函数将一个已知字符串复制给一个字符数组。程序内容如下:
#include <iostream.h>
#include <string.h>
void main() {
char s1[8], s3[8];
char s2[] = "string";
strcpy(s1, s2);
strncpy(s3, s1, 3);
s3[3] = '\0';
cout << "s1: " << s1 << endl;
cout << "s3: " << s3 << endl;
char *s4 = strcpy(s3, strcpy(s1, s2));
cout << "s4: " << s4 << endl;
}
该程序执行后,输出如下结果:
s1: string
s3: str
s4: string
说明:该程序有以下几点值得注意。
-
strcpy()
函数的第一个参数所使用的字符数组要足够大,能够将第二个参数所指的字符串容纳下。 -
字符串复制函数还有一个下述所示的函数原型说明:
char *strncpy(char *s1, const char *s2, int n);
其中,
n
是一个int
型数,用来表示仅将s2
所指定的字符串中前n
个字符复制到s1
中。使用该函数时,在复制完成后,要对新的字符数组加上一个字符串结束符\0
。 -
使用
strcpy()
函数时,第一个参数被更新,而第二个参数保持内容不变,返回的是第一个参数的指针。 -
程序中,注意下述的函数调用:
strcpy(s3, strcpy(s1, s2));
调用中,将
strcpy(s1, s2)
的返回值作为函数参数,因为strcpy()
返回一个char
型指针,即s1
所指向的字符串。这样调用实际上是将s2
中的字符串先复制给s1
,再将s1
的字符串复制给s3
。因此,s1
、s2
和s3
中都有相同的字符串;又将其复制给s4
,使它也具有与s1
、s2
和s3
相同的字符串。
3. 字符串连接函数strcat()
该函数的功能是将一个字符串添加到另一个字符串的后面,形成一个包含了两个字符串的新字符串。该字符串连接函数的原型说明如下:
char *strcat(char *s1, const char *s2);
其中,s1
和s2
都是字符指针或字符数组,该函数用来返回指针参数s1
的值。注意,调用该函数时,必须保证s1
所指向的对象有足够的空间能够容纳s2
所添加的字符串。一般要求,s1
所指的对象不小于strlen(s1) + strlen(s2) + 1
。
例4.28 使用字符串连接函数连接字符串。分析下列程序的输出结果:
#include <iostream.h>
#include <string.h>
void main() {
char s1[30] = "first";
char s2[20] = "second";
char s3[10] = "third";
char s4[30];
strcpy(s4, s1);
strcat(s4, s2);
strcat(s4, s3);
cout << "s4: " << s4 << endl;
cout << strcat(s1, strncat(s2, s3, 3)) << endl;
}
执行该程序输出如下结果:
s4: firstsecondthird
firstsecondth
说明:
-
该程序中使用了字符串复制函数
strcpy()
、字符串连接函数strcat()
和strncat()
。其中,strncat()
函数的原型说明如下:char *strncat(char *s1, const char *s2, int n);
其中,
n
是一个int
型数,用来表示仅将s2
所指定的字符串中前n
个字符连接到s1
中。
这些字符串处理函数用来在C++语言中处理字符串时不是很方便,因此,在标准C++语言中,使用string
类可以更加方便地实现字符串的处理。