C语言中字符数组,c++中字符串数组
1.字符数组的定义和初始化
理解数组初始化最简单的方法是将字符逐个分配给数组中的每个元素。
char str[10]={ I , , a , m , , h , a , p , p , y };
即,10个字符被分别分配给str[0]至STR [9]的10个元素。
如果大括号中提供的字符数大于数组长度,将被视为语法错误;如果小于数组长度,则只设置这些字符数组中的第一个元素,其余元素将自动设置为空字符(即 \0 )。
2.字符数组和字符串
在C语言中,字符串被视为字符数组。(C中的否)
在实际应用中,人们关心的是有效字符串的长度,而不是字符数组的长度。例如,定义了一个字符数组的长度为100,但实际有效字符只有40个。为了确定一个字符串的实际长度,C语言指定了一个“字符串结束标志”,用字符 \0 来表示。如果存在第10个字符为 \0 的字符串,则该字符串的有效字符为9。也就是说,当遇到第一个字符 \0 时,它表示字符串的结尾,它之前的字符构成字符串。
系统字符串常量中会自动添加一个“\0”作为终止符。比如‘C程序’有9个字符,但占用内存10个字节,最后一个字节 \0 是系统自动添加的。(由sizeof()函数验证)
有了结束符号 \0 ,字符数组的长度就不那么重要了。在程序中,经常使用 \0 的位置来确定字符串是否结束,而不是根据数组的长度来确定字符串长度。当然,在定义字符数组时,我们要估计实际的字符串长度,以保证数组长度总是大于实际的字符串长度。(在实际的字符串定义中,数组长度往往是不指定的,比如char str[])
注意:“\n”代表ASCII码为0的字符。从ASCII码表中可以发现,ASCII码为0的字符不是可显示字符,而是“空运算符”,即什么都不做。当它用作字符串的结束符号时,它不会生成额外的操作或添加有效字符,而只是一个用于标识的符号。
从上面了解了C语言中处理字符串的方法后,在初始化字符数组的方法中增加一个方法3354,即可以用字符串常量初始化字符数组:
char str[ ]={ 我很开心 };您可以省略花括号,如下所示
char str[ ]=我很开心;
注意:上述字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值。字符数组的赋值只能对其元素逐个赋值,下面的赋值方法是错误的。
char str[];
str=‘我很快乐’;
不使用单个字符作为初始值,而是使用一个字符串(注意:字符串两端用双引号""而不是单引号" "括起来)作为初始值。显然,这种方法更加直观和方便。(注意:数组str的长度不是10,而是11。请记住这一点,因为系统会自动在字符串常量“I happy”的末尾添加一个“0”
因此,上述初始化等同于以下初始化。
char str[ ]={I , , a , m , , h , a , p , p , y , \ 0 };
但不等同于以下内容
char str[ ]={I , , a , m , ,h , a , p , p , y };
前者的长度是11,后者的长度是10。
注意:字符数组不要求它的最后一个字符是 \0 ,甚至不包含 \0 。这样写是完全合法的。
char str[5]={C , h , I , n , a };
可以看出,用两种不同的方法初始化字符数组得到的数组长度是不同的。
#包含stdio.h
无效总管(无效)
{
char c1[]={I , , a , m , ,h , a , p , p , y };
char c2[]=我快乐;
int i1=sizeof(C1);
int I2=sizeof(C2);
printf(%d\n ,i1);
printf(%d\n ,I2);
}
结果:10比11
3.字符串的表示
在C语言中,有两种方法来表示和存储字符串:
(1)字符数组用于存储字符串
char str[ ]=我爱中国;
(2)用字符指针指向一个字符串
char* str=我爱中国;
至于第二种表示,有人认为str是一个字符串变量,所以在定义的时候把字符串常量‘我爱中国’直接赋给字符串变量是错误的。
c语言把字符串常量当作字符数组,在内存中开辟一个字符数组来存储字符串常量。程序在定义字符串指针变量str时,只将字符串的第一个地址(即存储字符串的字符数组的第一个地址)赋给str。
两种表示形式的字符串输出都使用
printf(%s\n ,str);
%s是指输出一个字符串,给字符指针的变量名str(对于第一种表示方法,字符数组的名字是字符数组的第一个地址,和第二种表示方法中指针的含义一致),那么系统会先输出它所指向的一个字符的数据,然后自动让str自动加1指向下一个字符.这样,直到遇到字符串标识符 \0 的结尾。
4.用字符指针变量和字符数组表示字符串的探讨。
虽然字符数组和字符指针变量都可以实现字符串的存储和操作,但它们是不同的,不应该混淆。
4.1.字符数组由若干个元素组成,每个元素包含一个字符;地址(字符串/字符数组的第一个地址)存储在字符指针变量中,字符串从不放入字符指针变量(字符串的第一个地址)。
4.2.分配方法:
对于字符数组,只能给每个元素赋值。不能通过以下方式为字符数组赋值。
char string[14];
str=我爱中国;(但可以在字符数组初始化的时候完成,即char str[14]=我爱中国;)
对于字符指针变量,以下方法用于赋值:
char * a;
a=‘我爱中国’;
或者char* a=我爱中国;没有什么是不可接受的
4.3.将初始值(初始化)赋给字符指针变量:
char* a=我爱中国;
相当于:
char * a;
a=‘我爱中国’;
用于字符数组的初始化
char str[14]=我爱中国;
不能等同于:
char string[14];
str=我爱中国;(这不是初始化,是赋值,像这样给数组赋值是不对的)
4.4.如果定义了一个字符数组,那么它就有一个确定的内存地址;在定义字符指针变量时,并不指向某个字符数据,可以多次赋值。
5.字符串处理功能
5.1
char *strcat(char *str1,const char * 2);
char * strcat(char * strDestination,const char * strSource);
函数:函数将字符串str2连接到str1的末尾,并返回指针str1。
注意:串联的前两个字符串后有一个“\0”。串联时,字符串1后面的 \ 0 将被删除,只有一个 \ 0 将保留在新字符串的末尾。
5.2
char *strcpy(char *str1,const char * 2);
char * strcpy(char * strDestination,const char * strSource);
函数:将字符串strSource中的字符复制到字符串strDestination,包括空终止符。是返回值指针strDestination。
注:1。“字符数组1”必须写成数组名,“字符串2”可以是字符数组名,也可以是字符串常量。
2.复制时将字符串后的 \0 复制到数组1。
3.不能用赋值语句直接把字符串常量或字符数组赋给字符数组(和普通变量数组一样),只能用strcpy函数处理。
4.您可以使用strcpy函数将字符串2中的前几个字符复制到字符数组1中。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。