自学内容网 自学内容网

重生之我在21世纪学C++—字符数组

1、字符数组介绍

数组的元素如果是字符类型,这种数组就是字符数组,字符数组可以是一维数组,也可以是二维数组。

char str1[ 5 ];        //这是一维字符数组

char str2[ 5 ][ 5 ];        //这是二维字符数组

C 语言中使用双引号括起来的一串字符表示字符串,这种方式虽然在 C++ 中也是支持的,但是一般我们会将这种字符串称为 C 语言风格的字符串。如果需要将一个 C 语言风格的字符串存储起来,就可以用字符数组来存储。

(1)字符数组初始化

字符数组的初始化有 2 种方式,如下:

1)  char ch1[10] = "abcdef";

        char ch2[ ] = "abcdef";        //如果数组初始化的时候,数组的大小省略不写,数组大小会根据初始化内容来确定。(比如数组ch2的元素个数就是7,因为有7个字符,字符串末尾还隐藏了一个 '\0' )

2)char ch3[10] = {'a', 'b', 'c', 'd', 'e', 'f'};

      char ch4[ ] = {'a', 'b', 'c', 'd', 'e', 'f'};        //数组ch4的元素个数为6,无 '\0'

上述两种初始化的区别是,第一中有一个隐藏的字符 '\0' 也被存到了数组中,而第二种则没有

这 个 '\0' 的意义非凡,是字符串的结束标志

(2)字符串长度— strlen

C++ 中有一个库函数叫: strlen ,可以用来求字符串的长度,其实strlen统计的就是字符串中 '\0' 之前的字符个数(从这里我们可以知道,如果字符数组里没有 '\0' ,就会导致问题出现)。 strlen 需要的头文件是 <cstring> 。

函数原型如下:

size_t strlen ( const char * str );

str  是指针,存放的是字符串的起始地址,strlen就是从这个地址开始,直到遇到 '\0' 结束计数,从而得到字符串的长度。

举例:

2、字符数组的输入

(1)输入没有空格的字符串

1)scanf

2)cin

上面两个代码都是将字符串读取后从数组的起始位置开始存放的,当然也可以指定位置开始存放,比如从数组的第二个元素的位置开始存放,如下代码:

str表示数组的起始位置,+1 意思是跳过一个元素,来到第二个元素的起始位置(加几就从下标几开始)。

scanf :

cin :

(2)输入有空格的字符串

scanf 和 cin 遇到空白字符就结束读取了,所以使用普通的scanf 和 cin 不能读取有空格的字符串。

这里特别说一下占位符,它其实不能简单地等同于字符串。它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止,就停止读取。
因为 %s 的读取不会包含空白字符,所以无法用来读取带有空格的字符串,除非多个 %s 一起使用,但是这很麻烦,且容易出现问题。另外有一个细节需要注意一下,就是 scanf () 遇到 %s 占位符的时候,就会在字符串变量末尾存储一个 '\0' 字符。

cin 读取一个字符串,在遇到空白字符的时候,就认为字符串结束了,不再继续往后读取剩余的字符,同时将已经读取到的字符串末尾加上 '\0' ,直接存储起来。

同时 scanf () 将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时,很可能会超过数组的边界,导致预想不到的结果。为了防止这种情况,使用 %s 占位符时,可以指定读入字符串的最大长度,即写成 %[m]s ,其中的 [m] 是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。

1)gets 和 fgets

char * gets ( char * str );

char * fgets ( char * str, int num, FILE * stream );

gets 是从第一个字符开始读取的,一直读取到 \n 停止,但是不会读取 \n ,也就是读取到的内容中没有包含 \n ,但是会在读取到的内容后自动加上 \0

fgets 是从第一个字符开始读取,最多读取 num - 1 个字符最后一个位置留给 \0 ,如果 num 的长度是远大于输入的字符串长度,就会一直读取到 \n 停止,并且会读取 \n ,将 \n 作为读取到内容的一部分,同时在读取到的内容后自动加上 \0

使用 gets 函数的方式,这种方式虽然能解决问题,但是因为 gets 存在安全性问题,在 C++11 中取消了 gets 函数,并给出了更加安全的方案: fgets 函数。

2)scanf

 C 语言中使用 scanf 函数其实也能做到读取带有空格的字符串,只是不常见而已。方式就是将 "%s" 改成 "%[^ \n] s",就是在 % 和 s 之间加上了 [^ \n],意思是一直读取,直到遇到 \n,这样即使遇到空格也就不会结束读取了。这种方式读取,不会将 \n 读取进来,并且在读取到的字符串末尾会自动加上 \0。

3)getchar

使用 getchar 逐个字符的读取,也是可以读取一个字符串的:

需要注意的是 getchar 只是用来读取字符,但是不会在末尾自动添加 '\0' ,需要自行添加或者把字符数组初始化为全0,因为字符 '\0' 的ASCII码就是 0 ,所以就相当于添加了 '\0'。

3、字符数组的输出

(1)C++ 中可以通过在 printf 函数中使用 %s 占位符的方式,打印字符数组中的字符串。

#include <cstdio>

int main()

{

        char a[ ] = "hello world";

        printf("%s\n", a);

        return 0;

}
(2)C++ 中可以使用 cout,直接打印字符数组中的字符串内容。

#include <iostream>

using namespace std;

int main()

{

        char a[ ] = "hello world";

        cout << a << endl;

        return 0;

}

(3)可以采用循环的方式逐个字符打印字符串的内容。

#include <iostream>

using namespace std;

int main()

{

        char a[] = "hello world";

        int i = 0;

        while (a[i] != '\0')

        {

                cout << a[ i ];

                i++;

        }

        cout << endl;

        return 0;

}

4、strcpy 和 strcat

(1)strcpy

C++中有一个库函数叫 strcpy 可以把一个字符数组中的字符串复制给另一个字符串

char * strcpy ( char * destination, const char * source );

destination 目标空间的地址source源头空间的地址 。需要的头文件是 <cstring>

 

(2)strcat

C++中有一个库函数叫 strcat,可以完成在一个字符串的末尾再追加一个字符串

char * strcat ( char * destination, const char * source );

destination目标空间的地址source源头空间的地址。需要的头文件是 <cstring>


原文地址:https://blog.csdn.net/2401_86861045/article/details/144405493

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!