C++编程学习(第23天)
字符数组
用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符,字符数组具有数组的共同属性。
定义和初始化字符数组
定义字符数组的方法和前面介绍的类似,如:
char c[6];
c[0]='h',c[1]='e',c[2]='l',c[3]='l',c[4]='o';
对字符数组进行初始化,最容易理解的方式就是逐个字符赋给字符中个元素。
char c[5]={'h','e','l','l','0'};
如果花括号中提供的初值个数大于数组长度,则按语法错误处理。
如果花括号中初值个数小于数组长度,则只将这些字符赋给数组中前面的那些元素,其余的元素自动定义为空字符('\0')。
如果提供的初值个数与预定的数组长度相同,在定义时可省略数组长度,系统会自动根据初值个数确定数组长度。
字符数组的赋值和引用
只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值。
例1:设计和输出一个钻石图形。
#include <iostream>
using namespace std;int main()
{int i, j;char c[5][5] = { {' ',' ','*'},{' ','*',' ','*',' '},{'*',' ',' ',' ','*'},{' ','*',' ','*',' '},{' ',' ','*'}};for (i = 0; i <= 4; i++){for (j = 0; j <= 4; j++)cout << c[i][j];cout << endl;}return 0;
}
结果如下:
字符串和字符串结束标志
为了测定字符数组中字符串的实际长度,C++规定了一个字符串结束标志,以字符'\0'代表。也就是说,遇到字符'\0'就表示字符串到此结束,由它前面的字符组成有效字符串。
对一个字符串常量,系统会自动在所有字符的后面加一个'\0'作为结束符,然后再把它存储在字符数组中。
在程序中往往依靠检测'\0'的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。
由此,我们还可以使用以下方法对数组进行初始化。
char str={"hello!"};
也可以省略花括号,
char str="hello!";
不是用单个字符作为初值,而是用一个字符串作为初值。
需要注意的是
'\0'代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个能够显示的字符,而是一个空操作符,即它什么也不干。用它来做字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。
字符数组并不要求它的最后一个字符必须为'\0',甚至可以不包含'\0'。
但是由于C++编译系统对字符串常量自动加一个'\0',因此,人们为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应的处理,在字符数组中有效字符后面也人为加上一个'\0'
字符数组的输入输出
字符数组的输入输出有两种方法
1、逐个字符输入输出
2、将整个字符串一次输入输出。如:
char str[10];
cin >>str; //输入时,输入一串字符
cout<<str; //输出时,输出全部字符
需要注意的是
1.输出的字符不包括结束符'\0'.
2.输出字符串时,cout流中用字符数组名,而不是数组元素名。
3.如果数组长度大于字符串实际长度,输出遇'\0'结束。
4.如果一个字符数组中包含一个以上'\0',则遇到第一个'\0'输出就结束
5.用cin从键盘向计算机输入一个字符串时,从键盘输入的字符串应短于已定义的字符数组的长度,否则会出现问题。
使用字符串处理函数对字符串进行操作
字符串连接函数strcat
其函数原型为:
strcat(char[],const char[]);
strcat是string catenate(字符串连接)的缩写。该函数有两个字符数组参数,函数的作用是将第二个字符数组中的字符串连接到前面字符数组的字符串后面。第二个数组被声明为const,以保证该数组中的内容不会在函数调用期间修改,连接后的字符串放在第一个字符数组中,函数调用后的到的函数值就是第一个字符数组的地址。
字符串复制函数strcpy
其函数原型为:
strcpy(char[],const char[]);
strcpy是string copy(字符串复制)的缩写。它的作用是将第二个字符数组中的字符串复制到第一个字符数组中去,将第一个字符数组中的相应字符覆盖。第二个参数是字符型常数组,它是不能被改变值的。
需要注意的是
1、在调用strcpy函数时,第一个实参必须是数组名,第二个实参可以是字符数组名,也可以是一个字符串常量。
2、可以用strcpy函数将一个字符串中前若干字符复制到一个字符数组中去。如strcpy(str1,str2,2)
3、只能通过调用strcpy函数来实现将一个字符串赋给一个字符数组,而不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。
字符串比较函数
其函数原型为:
strcmp(const char[],const char[]);
strcmp是string compare(字符串比较)的缩写,作用是比较两个字符串。由于这两个字符数组只参加比较而不应改变其内容,因此两个参数都加上const声明。比较的结果由函数值带回,如果str1==str2,函数值为0;如果str1>str2,函数值为一正整数;如果str1<str2,函数值为一负整数。
字符串比较的规则与其它语言中的规则相同,即对两个字符串自左至右逐个字符相比,按ASCII码大小比较,直到出现不同的字符或遇到'\0'为止。如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
字符串长度函数strlen
其函数原型为:
strlen(const char[]);
strlen是string length(字符串长度)的缩写。它是测试字符串长度的函数,其函数的值为字符串中的实际长度,不包括'\0'在内。
例2:有三个国家名,要求找出按字母顺序排在最前面的国家。
#include <iostream>
#include <string>
using namespace std;int main()
{void smallest(char str[][30]);int i;char country_name[3][30];cout << "请输入国家名字:" << endl;for (i = 0; i < 3; i++)cin >> country_name[i];smallest(country_name);return 0;
}void smallest(char str[3][30])
{int i;char a[30];strcpy_s(a, str[0]);for (i = 0; i < 3; i++)if (strcmp(str[i], a) < 0)strcpy_s(a, str[i]);cout << "最小国家为:" << a << endl;
}
结果如下: