3、字符串
(1)字符串常量与字符常量除了所使用的引号不同以外,最重要的区别是存储形式不同。系统会在字符串的末尾自动添加1个空字符’\0’作为字符串的结束符,所以每个字符串的存储长度总是比其实际长度多1。
例一:从键盘输入三个字符串,找出最长的字符串,将其内容输出。
#include <iostream>
using namespace std;
int main(){
char array[3][20];
int length[3];
int max;
int index;
for(int i=0;i<3;i++){
cout << "请输入第" << i+1 << "个字符串" << endl;
cin >> array[i];
}
for(int k=0;k<3;k++){
length[k] = strlen(array[k]);
}
max = length[0];
index = 0;
for(int j=1;j<3;j++){
if(length[j] > max){
max = length[j];
index = j;
}
}
cout << "最长的字符串是第" << index+1 << "个,其内容是:" << array[index] << endl;
return 0;
}
例二:程序运行时输入待取子串在字符串中的起始位置和待取子串的长度,并根据实际需要采用堆内存分配方式动态分配存储该子串所需要的内存空间。
#include <iostream>
using namespace std;
int main(){
char array[] = "welcome to my world!";
char * p;
int start;
int length;
cout << "原字符串是:" << array << endl;
cout << "请输入子串的起始位置。" << endl;
cin >> start;
cout << "请输入子串的长度。" << endl;
cin >> length;
p = new char[length+1]; //长度为length+1,因为最后还有一个结束符'\0'
if(p == NULL){ //判断堆内存是否分配成功
cout << "堆内存分配失败!" << endl;
return 0;
}
for(int i=0;i<length;i++){
p[i] = array[start+i];
}
p[i] = '\0';
cout << "子串是:" << p << endl;
delete []p;
return 0;
}
(2)puts()函数与cout功能类似,puts()函数输出字符串后会自动换行。
(3)gets()函数与cin功能类似,但使用gets()函数时输入空格并不表示字符串输入结束,而使用cin时输入空格则表示字符串输入结束。
(4)strlen(str)字符串长度计算函数
(5)strcpy(destination,source)字符串拷贝函数
(6)strcmp(str1,str2)字符串比较函数。如果str1和str2的内容完全一致,则返回0,如果str1的内容大于str2的内容,则返回大于0的数,否则,返回小于0的数。
(7)strcat(destination,source)字符串连接函数。destination所指向的内存空间要足够大,能够容纳连接后得到的新字符串,否则会出现内存越界问题。
(8)要对非字符型数组进行输入输出,必须逐个元素进行,而字符串的输入输出操作可以整体进行。
(9)字符串以字符数组的形式存储时,可以使用指针来操作字符串。
4、函数
(1)当调用一个函数时,系统会将当前函数的运行状态保存起来,然后再去执行被调用的函数;当被调用的函数执行完毕后,系统会将刚才保存的运行状态恢复,从调用函数出继续执行后面的语句。
(2)默认形参值必须严格按照从右至左的顺序进行制定。Eg:void fun(int a=1,int b,int c=3,int d=4);
这种写法是不对的,这是由于在第二个参数未指定默认形参值的情况下,给出了第一个参数a的默认形参值,不符合从右至左的指定顺序。
(3)当函数功能比较简单且被频繁调用时,在设计程序时可以考虑使用内联函数。内联函数不能含有循环语句和switch语句,并且内联函数只适合小函数、代码不能太多。
(4)重载的函数必须在形参列表上有所区别。如果仅仅是返回类型不同,不能作为重载函数。
(5)函数指针:
定义形式:返回类型(*指针变量名)(形参类型表)
返回类型和形参类型表必须与该指针变量所要指向的函数的返回类型和形参表中的形参数目、形参类型完全一致。
例一:求两个数的最大值。
#include <iostream>
using namespace std;
int max(int x,int y);
int main(){
int (*p)(int,int); //定义函数指针变量
p = max;
cout << p(5,10) << endl;
cout << (*p)(23,12) << endl;
return 0;
}
int max(int x,int y){
return x>y?x:y;
}
(6)在C++中,一个函数使用return语句只能返回一个值,如果需要函数返回多个值,可以使用下面的方式。
例二:求数组中的最大值、最小值和总和。
#include <iostream>
using namespace std;
void mms(int array[],int n,int * max,int * min,int * sum);
int main(){
int array[] = {12,0,34,-5,9};
int max,min,sum;
mms(array,5,&max,&min,&sum);
cout << "最大值是:" << max << endl;
cout << "最小值是:" << min << endl;
cout << "总和是:" << sum << endl;
return 0;
}
void mms(int array[],int n,int * max,int * min,int * sum){
*max = *min = *sum = array[0];
for(int i=1;i<n;i++){
if(*max < array[i]){
*max = array[i];
}
if(*min > array[i]){
*min = array[i];
}
*sum = *sum + array[i];
}
}
(7)指针函数:返回值为指针类型的函数。
例三:求多个字符串中最大的字符串。
#include <iostream>
using namespace std;
char * max(char * str[],int n);
int main(){
char * str[] = {"beijing","shanghai","xian"};
char * p;
p = max(str,3);
cout << "最大的字符串是:" << p << endl;
return 0;
}
char * max(char * str[],int n){
char * temp = str[0];
for(int i=1;i<n;i++){
if(strcmp(temp,str[i]) < 0){
temp = str[i];
}
}
return temp;
}