C++字符数组的用法(非常详细)
C++ 中,用来存放字符的数组就是字符数组。字符数组里一个元素存放一个字符。
1) 数组元素逐一赋值,代码如下:
2) 聚合方式赋值,代码如下:
使用字符数组时,需要注意:
1) 聚合方式赋值只能在数组声明时使用。例如:
2) 不能用字符数组给另一个字符数组赋值。例如:
可以使用字符串为字符数组赋值,例如:
【实例 1】打印“HELLO”标志。本实例中,定义一个字符数组,通过初始化操作保存一个字符串,然后输出这个字符串。程序代码如下:
【实例 2】定义一个字符数组并进行部分元素赋值,然后输出该字符数组。当程序中未使用字符串结束符 '\0' 时,程序代码如下:
修改程序,在字符数组中添加字符串结束符 '\0',程序代码如下:
要想使用 strcat() 函数,需要在程序开头包含 <string.h> 文件。下面来看一个例子。使用字符连接函数 strcat(),将输入的两个字符串连接在一起。具体代码如下:
说明:
同样,要想使用 strcpy() 函数,需要在程序开头包含 <string.h> 文件。下面来看一个例子:
进行字符串比较时,以第一个不同字符的比较结果作为整个字符串的比较结果。
strcmp() 函数还可以比较两个字符串常量,或比较数组和字符串常量。例如:
下面来看一个例子。银行取款时需要输入密码,输入正确方能取款。假设正确的密码为 574824,共有 3 次输入机会,如果都输错了,就给出提示信息“请到人工处办理解锁”。
例如,判断用户输入的密码是否为 6 位。在 main() 函数中定义两个字符数组,用来存储用户输入的字符串,然后调用 strlen() 函数计算字符串的长度,使用 if...else 语句判断长度是否等于 6。
C++字符数组的声明与初始化
例如,下面的代码声明了一个字符数组 pWord[11]:char pWord[11];为该字符数组赋值“HELLO WORLD”,既可以采用逐个元素赋值,也可以采用聚合方式赋值。
1) 数组元素逐一赋值,代码如下:
pWord[0]='H'; pWord[1]='E'; pWord[2]='L'; pWord[3]='L'; pWord[4]='O'; pWord[5]=' '; pWord[6]='W'; pWord[7]='O'; pWord[8]='R'; pWord[9]='L'; pWord[10]='D';
2) 聚合方式赋值,代码如下:
char pWord[]={'H','E','L','L','O',' ','W','O','R','L','D'};
- 如果大括号中提供的初值个数大于数组长度,则按语法错误处理;
- 如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定义为空字符;
- 如果初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统自动根据初值个数确定数组长度。
使用字符数组时,需要注意:
1) 聚合方式赋值只能在数组声明时使用。例如:
char pWord[5]; pWord = {'H', 'E', 'L', 'L', 'O'}; // 错误,只能在数组声明时使用
2) 不能用字符数组给另一个字符数组赋值。例如:
char a[5] = {'H', 'E', 'L', 'L', 'O'}; char b[5]; a = b; // 错误,不能用一个数组给另一个数组赋值 a[0] = b[0]; // 正确
C++字符串
在 C++ 程序中,字符数组常用于存储字符串,此时要连同字符串结束符 '\0' 一起保存。可以使用字符串为字符数组赋值,例如:
char a[] = "HELLO WORLD";等同于:
char a[] = "HELLO WORLD\0";字符串结束符 '\0' 的作用是提示字符串处理函数,该字符串已经结束,不需要再访问内存。
【实例 1】打印“HELLO”标志。本实例中,定义一个字符数组,通过初始化操作保存一个字符串,然后输出这个字符串。程序代码如下:
#include <iostream> using namespace std; int main() { char cArray[6] = "HELLO"; cout << cArray; return 0; }程序运行结果为:
HELLO字符数组与字符串的本质区别就在于是否含有字符串结束符 '\0'。字符数组中,其元素可以存放任意字符,并不要求最后一个字符必须是'\0'。但作为字符串使用时,就必须以 '\0' 结束,缺少这一标志时,系统虽然不一定会报错(有时甚至会得到看似正确的运行结果),但这种潜在的错误可能会导致严重后果。因为在字符串处理过程中,系统在未遇到字符串结束符之前,会一直向后访问,以致会超出分配给字符串的内存空间,或者访问到其他数据所在的存储单元。
【实例 2】定义一个字符数组并进行部分元素赋值,然后输出该字符数组。当程序中未使用字符串结束符 '\0' 时,程序代码如下:
#include <iostream> using namespace std; int main() { int i; char array[12]; // 定义字符数组 array array[0] = 'a'; // 只为前两个数组元素赋值 array[1] = 'b'; cout << array; // 输出数组 }程序运行结果为:
ab烫烫烫烫烫烫烫
当字符串中缺少 '\0' 结束符时,函数会按整个字符数组的长度读取内存空间并输出。由于 array 字符数组中只有前两个字符初始化了,所以后续输出的是乱码。修改程序,在字符数组中添加字符串结束符 '\0',程序代码如下:
#include <iostream> using namespace std; int main() { int i; char array[12]; // 定义字符数组 array array[0] = 'a'; // 为前两个数组元素赋值 array[1] = 'b'; array[2] = '\0'; // 添加字符串结束符'\0' cout << array; // 输出数组 }程序运行结果为:
ab
C++字符串常用处理函数
1) 字符串连接函数strcat()
字符串连接函数 strcat() 是库函数,其语法格式如下:strcat(字符数组名1, 字符数组名2)strcat() 函数的功能是,删去字符数组 1 中的字符串结束符'\0',然后将字符数组 2 中的字符串连接到字符数组 1 原字符串后。最终,字符数组 1 中存储的将是连接后的字符串。
要想使用 strcat() 函数,需要在程序开头包含 <string.h> 文件。下面来看一个例子。使用字符连接函数 strcat(),将输入的两个字符串连接在一起。具体代码如下:
#include <iostream> #include <string.h> using namespace std; int main() { char str1[30], str2[20]; cout << "please input string1:" << endl; // 输入字符串 1,存于字符数组 1 中 gets(str1); cout << "please input string2:" << endl; // 输入字符串 2,存于字符数组 2 中 gets(str2); strcat(str1, str2); // 连接字符串 1 和字符串 2 cout << "Now the string1 is:" << endl; puts(str1); // 输出字符数组 1 中存储的新字符串 }程序运行结果为:
please input string1:
hello
please input string2:
world
Now the string1 is:
hello world
2) 字符串复制函数strcpy()
字符串复制函数 strcpy() 的语法格式如下:strcpy(字符数组名1, 字符数组名2)strcpy() 函数的功能是,把字符数组 2 中的字符串复制到字符数组 1 中,字符串结束符 '\0' 也一同复制过去。最终,字符数组 1 中存储的将是字符数组 2 中的字符串。
说明:
- 字符数组 1 应有足够的长度,以能存下复制的字符串 2。
- 字符数组 1 必须写成数组名形式,字符数组 2 既可以是字符数组名,也可以是一个字符串常量,这时相当于把一个字符串赋予一个字符数组。
同样,要想使用 strcpy() 函数,需要在程序开头包含 <string.h> 文件。下面来看一个例子:
#include <iostream> #include <string> using namespace std; int main() { char str1[30], str2[20]; cout << "please input string1:" << endl; // 输入字符串 1,存于字符数组 1 中 gets(str1); cout << "please input string2:" << endl; // 输入字符串 2,存于字符数组 2 中 gets(str2); strcpy(str1, str2); // 将字符串 2 复制到字符数组 1 中 cout << "Now the string1 is:" << endl; // 输出字符数组 1 中存储的新字符串 puts(str1); }程序运行结果为:
please input string1:
www.
please input string2:
c.biancheng.net
Now the string1 is:
c.biancheng.net
- strcpy() 函数用字符数组 2 中的字符串覆盖字符数组 1 中的内容;
- strcat() 函数不存在覆盖问题,只是单纯地将字符数组 2 中的字符串连接到字符数组 1 中的字符串后面。
3) 字符串比较函数 strcmp()
字符串比较函数 strcmp() 的语法格式如下:strcmp(字符数组名1, 字符数组名2)strcmp() 函数的功能是,对两个数组中的字符串逐个字符地进行比较(大小判定依据为字符对应的 ASCII 码值),并返回比较结果:
- 如果字符串 1 = 字符串 2,返回值为 0。此时字符串 1 和字符串 2 完全相同;
- 如果字符串 1 > 字符串 2,返回值为一个正数;
- 如果字符串 1 < 字符串 2,返回值为一个负数。
进行字符串比较时,以第一个不同字符的比较结果作为整个字符串的比较结果。
strcmp() 函数还可以比较两个字符串常量,或比较数组和字符串常量。例如:
strcmp(str1, str2); strcmp(str1, "hello"); strcmp("hello", "how");
下面来看一个例子。银行取款时需要输入密码,输入正确方能取款。假设正确的密码为 574824,共有 3 次输入机会,如果都输错了,就给出提示信息“请到人工处办理解锁”。
#include <iostream> #include <string.h> using namespace std; int main() { char password[20] = {"574824"}; // 数组 password 存储正确的密码字符串 char pswstr[20]; // 数组 pswstr 存储用户输入的密码字符串 int i = 1; // 定义变量 i,表示密码输入次数 //while 循环,表示有 3 次密码输入机会 while(i <= 3) { cout << "输入密码字符串:\n"; gets(pswstr); // 用户输入密码字符串 if(strcmp(password, pswstr)) // 比较用户输入的密码和正确密码,如果两个密码不一致 { cout << "第"<< i << "次,密码字符串输入错误!\n"; // 提示密码输入错误 } else // 如果两个密码一致 { cout << "密码正确,请选择服务!\n"; // 提示下一步操作 break; // 退出 while 循环 } i++; // 输入错误次数加 1 } if(i == 4) // 如果输入错误次数超过 3 次 { cout << "输入字符串错误 3 次!请到人工处办理解锁\n"; } return 0; // 程序结束 }运行结果为:
输入密码字符串:
123456
第1次,密码字符串输入错误!
输入密码字符串:
111111
第2次,密码字符串输入错误!
输入密码字符串:
574824
密码正确,请选择服务!
4) 字符串长度函数 strlen()
字符串长度函数 strlen() 的语法格式如下:strlen(字符数组名)strlen() 函数的功能是,计算并返回字符串的实际长度(不含字符串结束符 '\0')。
例如,判断用户输入的密码是否为 6 位。在 main() 函数中定义两个字符数组,用来存储用户输入的字符串,然后调用 strlen() 函数计算字符串的长度,使用 if...else 语句判断长度是否等于 6。
#include <iostream> #include <string.h> using namespace std; int main() { char text[50]; // 定义数组 text,保存用户输入的密码 cout << "输入一个密码:\n"; gets(text); // 获取用户输入的字符串 if(strlen(text) == 6) // 计算字符串长度并判断是否等于 6 cout << "输入密码是6位\n"; else cout << "输入密码不是6位\n"; return 0; // 程序结束 }运行结果为:
输入一个密码:
123456
输入密码是6位