1.前言
字符串定义方法有两种方法:
1) 用字符数组;
2) 用字符指针;
对应两种定义方法,有不同的初始化以及赋值方法
2.字符数组的定义方法
1) char str[]="12345";或给字符串加上大括号:char str[]={"12345"};
这种方法定义时,系统会自动在字符串的末尾加上字符串结束符,即 ‘\0’,
2) char str[10]={'1','2','3','4','5'};
这种方法定义时,系统会自动从未初始化的元素开始,将之后的元素赋为\0,如上面的数组str中的元素实际上是:'1','2','3','4','5','\0','\0','\0','\0','\0'
3) char str[]={'1','2','3','4','5'};
这种方法定义时,系统不会自动在字符串的末尾加上字符串结束符;
此时用sizeof()函数可以正确求出其所占的内存大小;但用strlen()函数不能正确求出其长度,因为strlen是通过\0判断字符串结束的。
所以,采用该方法定义时,一般人为地加上\0,即char str[]={'1','2','3','4','5', '\0'};
易错情况:
1、char a[10]; a[10]="hello";//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!
2、char a[10]; a="hello";//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!
还有:不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。
补充:
无论是静态,局部还是全局数组只有在定义时才能初始话,否则必须通过其它方法,比如循环操作实现。
任何
int a[3];
static int b[3];
a[3] = {1, 2, 3};
b[3] = {1, 2, 3};
没有在定义时初始化都是错误的!
3. 用字符指针定义
1) 只能采用字符串的方式初始化:char *str3="12345";
注意:字符指针可以用字符串常量初始化和赋值;
即:char *str3;str3="12345";也是可以的
此时也可以用str3[4]的形式访问其中的元素,如cout<< str3[4];就会输出str指向的字符串的第四个元素。
该方法也是自动加上了字符串结束符的。
4. 示例
#include
#include
using namespace std;
int main()
{
char str1[]="12345";
char str2[10]={'1','2','3','4','5'};
char *str3="12345";
char str4[]={'1','2','3','4','5',0};
char str5[]={'1','2','3','4','5'};
printf("%d,%d,%d,%d,%d,%d\n",str2[5],str2[6],str2[7],str2[8],str2[9],str3[4]);
printf("各个字符串为:%s,%s,%s,%s,%s\n",str1,str2,str3,str4,str5);
printf("各个字符串的所占的内存大小为:%d,%d,%d,%d,%d\n",sizeof(str1),sizeof(str2),sizeof(str3),sizeof(str4),sizeof(str5));
printf("各个字符串的有效长度为:%d,%d,%d,%d,%d\n",strlen(str1),strlen(str2),strlen(str3),strlen(str4),strlen(str5));
printf("%d\n",strcmp(str1,str3));
printf("%d\n",strcmp(str1,str5));
}
运行结果:
0,0,0,0,0,53
各个字符串为:12345,12345,12345,12345,12345烫?2345
各个字符串的所占的内存大小为:6,10,4,6,5
各个字符串的有效长度为:5,5,5,5,13
0
-1
Press any key to continue