【C++】字符数组基本概念及字符串处理函数

字符数组的含义

  • 指元素为字符的数组,用来存放字符序列或者字符串
  • 以空字符 ‘\0’ 表示字符串结束

字符数组的定义和初始化

  1. 定义数组再分别运用下标赋值
char c[3];
c[0] = 'a';
c[1] = 'b';
c[2] = 'c';

  1. 定义数组同时用大括号赋值
char c[3] = {'a','b','c'};
  • 如果花括号中提供的初值个数大于数组长度,语法错误
  • 如果花括号中提供的初值个数小于数组长度,字符赋给数组中前面的那些元素,其余元素自动定位空字符(’\0’),
  • 如果花括号中提供的初值个数等于预定数组长度,定义时可以省略数组长度,数组根据初值个数确定数组长度
char [] = {'a','b','c'};

数组c长度自动定位3

  • 定义二维数组
char c[3][3] = {{a,b,c},{d,e,f}};
  1. 用字符串常量初始化字符数组
char c[] = {"abc"};
char c[] = "abc";//可以省略大括号,效果同上

字符串和字符串结束标志

  1. 用一个字符数组可以存放一个字符串中的字符
char str[5] = {'a','b','c'};

只有用字符数组存字符串时,才需要补充’\0’。
字符串实际长度3和数组长度5并不相等,在存放上面3个字符之外,系统字符数组对最后两个元素自动填补空字符’\0’。

为了测量字符串的实际长度,C++规定一个字符结束标志,以字符’\0’代表。

上面例子中,第四个字符为’\0’,表明字符串的有效字符为前面3个字符。也就是说遇到字符’\0’表示字符串到此结束,由它前面的字符组成字符串。

  1. 对于一个字符串常量,系统会在所有字符后面加一个’\0’作为结束符,例如字符"abc",一共3个字符,但在内存中共占4个字节,最后一个’\0’是系统自动加上
char c[] = {"abc"};//数组长度不是3而是4,和下一行等价
char c[] = {'a','b','c','\0'};
char c[] = {'a','b','c'};//不和上面的等价,但是格式同样合法

字符数组的赋值和引用

只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值。

数组只能在初始化时整体赋初值。以后再赋值只能逐一改变了

char c[5];
c = {'a','b','c'}; //错误,不能对整个数组一次赋值
c[0] = 'a';  //对数组元素赋值,正确
c[1] = 'b'; 
c[2] = 'c';

字符数组的输入和输出

方法一:scanf输入 printf输出
单个字符的输入和输出:

char str[10];
	for(i=0;i<5;i++) scanf("%c", &str[i]);
	for(i=4;i>0;i--) printf("%c", str[i]);

字符串整体输入输出:

char str[10];
scanf("%s", str);/*数组名str是数组的起始地址,不用&str*/
printf("%s", str);

方法二:gets输入,puts输出
输入:gets(字符数组名称)
gets用来从终端输入一行字符串并将其存放于一维数组(或二维数组的一维)中,读取字符串直到换行符结束,但换行符会被丢弃,然后再末尾添加‘\0’结束标
一次只能输入一个字符串,从光标开始到换行符,即输入的是一整行,且可以识别空格并将其输入,如果希望以空格作为分隔,即使用方法一。

输出:puts(字符数组名称)
将一个字符串输出到终端,并在输出时将字符串结束标记’\0’转换成’\n’,即输出完字符串后换行。
用puts函数输出的字符串中可以包含转义字符

#include 
int main(){
    char str1[20];
    char str2[5][10];
    gets(str1);
    for(int i = 0; i < 3; i ++){
        gets(str2[i]);
    }
    puts(str1);
    for(int i = 0; i < 3; i ++){
        puts(str2[i]);
    }
    return 0;
}

注意:用puts和gets函数只能输出或输入一个字符串,不能写成:

puts(str1,str2);
gets(str1,str2);

方法三:getchar输入,putchar输出
getchar和putchar分别用来输入和输出单个字符。getchar可以识别换行符和空格并将其保存。

#include 
int main(){
    char c1, c2, c3;
    c1 = getchar();
    c2 = getchar();
    c3 = getchar();		    
    putchar(c1);
    putchar(c2);
    putchar(c3);
    return 0;
}

在这里我们如果输入“a“,然后敲回车,然后输入”bc“,再敲回车,输出的结果会是这样:

a

b

这是由于getchar可以识别换行符,所以c2实际上存储的是换行符,因此字符c没有被存入,字符ab之间会有一个换行出现。

使用字符串处理函数

puts函数——输出字符串的函数

详见上文

gets函数——输入字符串的函数

详见上文

strcat函数——字符串连接函数

strcat(str1,str2);

把两个字符数组中的字符串连接起来,把str2接到str1的后面,结果放在str1中,函数调用后得到一个函数值——str1的地址。

举例:

char str1[30]=("Peoples Republic of");
char str2[]=("China");
printf("%s",strcat(strl , str2)) ;

输出结果:
People’s Republic of China

连接前后的状况如下所示:
【C++】字符数组基本概念及字符串处理函数_第1张图片
说明:

  1. 字符数组1必须足够大,以便容纳连接后的新字符串。本例中定义 str] 的长度为30,是足够大的,如果在定义时改用 strl[]={“People’s Republic of”},就会出问题,因长度不够。
  2. 连接前两个字符串的后面都有’\0’,连接时将字符串1后面的0取消,只在新串最后保留’0’。

strcpy和strncpy函数——字符串复制函数

strcpy(字符数组1,字符串2)

将字符串2复制到字符数组1中去
举例:

char str1[10],str2[]="China";
strcpy(strl,str2);

执行后,str1的状态如下:
在这里插入图片描述
说明:

  1. 字符数组1必须定义得足够大,以便容纳被复制的字符串2。字符数组1的长度不应小于字符串2的长度。
  2. “字符数组 1”必须写成数组名形式(如 str1),“字符串 2”可以是字符数组名,也可以是一个字符串常量。例如:
strcpy(strl,"China");

作用与前面相同。

  1. 如果在复制前未对 strl 数组初始化或赋值,则 strl 各字节中的内容是无法预知的,复制时将 str2 中的字符串和其后的\O’一起复制到字符数组1中,取代字符数组1中的前面6个字符,最后4个字符并不一定是 0’,而是 str1中原有的最后4个字节的内容。
  2. 不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如下面两行都是不合法的:
str1="China";//企图用赋值语句将一个字符串常量直接赋给一个字符数组
str1= str2;//企图用赋值语句将一个字符数组直接赋给另一个字符数数组

只能用 strcpy 函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。如下面的语句是合法的:

char a[5],cl,c2;
cl='A';c2='B';
a[0]='C';a[1]='h';a[2]='i';a[3]='n';a[4]='a';
  1. 可以用strncpy 函数将字符串2中前面n个字符复制到字符数组1中去。
    例如:
strncpy(strl,str2,2);

作用是将str2 中最前面2个字符复制到 str1 中,取代str1 中原有的最前面2个字符。但复制的字符个数n不应多于str1 中原有的字符(不包括 ‘\0’)。

strcmp函数——字符串比较函数

strcmp(str1,str2);

比较字符串1和字符串2
例如:

strcmp(strl ,str2);
strcmp("China","Korea") ;
strcmp(strl,"Beijing );

说明:
字符串比较的规则是:将两个字符串自左至右逐个字符相比(按 ASCII码值大小比较),直到出现不同的字符或遇到’\0’为止。
(1)如全部字符相同,则认为两个字符串相等;
(2)若出现不相同的字符,则以第 1 对不相同的字符的比较结果为准。

如果参加比较的两个字符串都由英文字母组成,则有一个简单的规律:
在英文字典中位置在后面的为“大”
例如:
computer 在字典中的位置在 compare 之后,所以”“computer”>“compare”。
但应注意小写字母比大写字母“大”,所以”DOG"<"cat”。

比较的结果由函数值带回。

  • 如果字符串1=字符串 2,则函数值为0。

  • 如果字符串 1>字符串 2,则函数值为一个正整数

  • 如果字符串 1<字符串 2,则函数值为一个负整数

注意:对两个字符串比较,不能用以下形式:

if(strl>str2)
	printf("yes");

而只能用

if(strcmp(strl,str2)>0)
	printf("yes");

strlen函数——测字符串长度的函数

strlen(字符数组)

测试字符串长度的函数,函数的值为字符串中的实际长度(不包括\0’在内)

char str[10]="China":
printf("%d",strlen(str));
strlen("China");//也可以直接测试字符串常量的长度

输出结果:
5

strlwr 函数——转换为小写的函数

strlwr(字符串)

strupr函数——转换为大写的函数

strupr (字符串)

引用

C/C++ 字符数组的输入输出
C++:字符数组
《C程序设计(第四版)》(谭浩强,清华大学出版社)

你可能感兴趣的:(C/C++,c++,算法,数据结构)