首页 > 编程笔记 > C++笔记 阅读:14

C++字符数组的用法(非常详细)

C++ 中,用来存放字符的数组就是字符数组。字符数组里一个元素存放一个字符。

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

使用 strcat() 函数时要注意,字符数组 1 的长度要足够大,以便能装下连接后的字符串。

2) 字符串复制函数strcpy()

字符串复制函数 strcpy() 的语法格式如下:
strcpy(字符数组名1, 字符数组名2)
strcpy() 函数的功能是,把字符数组 2 中的字符串复制到字符数组 1 中,字符串结束符 '\0' 也一同复制过去。最终,字符数组 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

strcat() 和 strcpy() 函数的区别如下:

3) 字符串比较函数 strcmp()

字符串比较函数 strcmp() 的语法格式如下:
strcmp(字符数组名1, 字符数组名2)
strcmp() 函数的功能是,对两个数组中的字符串逐个字符地进行比较(大小判定依据为字符对应的 ASCII 码值),并返回比较结果:
进行字符串比较时,以第一个不同字符的比较结果作为整个字符串的比较结果。

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位

相关文章