重生之我在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)!