文章目录
(1)C语言中,没有字符串类型但可以用字符数组模拟字符串。
(2)C语言中,字符串是以’\0’作结尾字符。
(3)C语言中,字符串常量本质上是一个无名的字符数组。
C风格的字符串有两种声明方式:
1. char str1 [] = “abc”;或 char str2[]={‘a’,‘b’,‘c’,‘\0’};//数组赋值
2. char * str3 =“abc”;
这两种方式都表示的是字符串数组。字符数组和字符串的区别 就看最后一个元素后面是否存在’\0’,有’\0’就是字符
串,没有就是普通数组。
如上 char arr[] ={‘a’,‘b’,‘c’};就是表示的是普通字符数组,但不是字符串。
如果字符数组中没有’\0’结尾,那该字符数组就是普通的字符数组,不是字符串。
字符串和字符数组很相似,但是有本质上的区别。
(1) C语言中,字符串是双引号括起来的单个或多个字符的集合,编译器自动在结尾加上’\0’字符。字符串常量存储在只读数据段,无法通
过指针进行修改字符串中的某个字符。
(2)C语言中,不能定义字符串(没有string关键字,C++才有),但是在C语言中使用字符串,通常会用字符数组来模拟字符串,必须
是’\0’结尾的字符数组,这个字符数组存储通常会分配在栈区(例如:char str [] = “abc”; 中的str就存储在栈区),也可以被称为字符
串,且该字符串中的字符是可以修改的。
C 语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串。那么,字符数组就一定是字符串吗?答:字符串一定是字符数组,但是字符数组不一定是字符串。
现在的编译器,已经不允许 使用 char * str = “abc”;这种形式声明定义字符串了,必须前面 加上 const。这也是标准的
方式:const char * str = “abc”;即使 char * str = “abc”; 在编译期,不报错,但是想通过 str[0] = ‘f’;修改静态区的字符串常量时,会报错。
所以这里最好在 char * str 前面 加上const。解决编译器不错报,而运行期报错的问题。
求普通数组和字符串的长度的方法:
如int a[] = {1,2,3,4}; char b[] = {‘a’,‘b’,‘c’};
正确方法是:数组a长度 = sizeof(a)/sizeof(a[0]) 或 sizeof(a)/sizeof(int)
数组b长度 = sizeof(b)/sizeof(b[0]) 或 sizeof(b)/sizeof(char)
字符串的长度计算:用strlen()方法。
函数原型 unsigned int strlen (char s);
strlen()方法说明:从字符串的开头位置依次往后面计数,直到遇到’\0’停止,所计算的字符串大小为’\0’以前的字符所计算的值,最终的字符串长度不包括’\0’;
例如:
char str1[] = {‘a’,‘b’,‘c’,‘d’,‘\0’};//strlen(str1) == 4 ,而sizeof(str1)= = 5 ,原因是sizeof运算符统计占用字节数时,含’\0’。
char str2[] = {‘a’,‘b’,‘\0’,‘c’,‘d’,‘\0’};//strlen(str2) == 2
char str3[] = {‘a’,‘b’,‘\0’,‘c’,‘d’};//strlen(str3) == 2
char str4[] =“abcd”;//strlen(str4) == 4,而sizeof(str1)= =5 原因同上
char str5 = “abcd”;;//strlen(str5) == 4 ,而sizeof(str1) == 5 原因同上
注意:不要用此方法求普通字符数组的长度,有可能有的编译器会正确执行strlen()函数,但是这个方法是用来求字符串的长度的,不是用来求数组的长度的。上面的str1,str2,str3,str4 都是数组类型 ,因为数组名,就是数组首元素的地址(而且数组名,不用于自增或自减操作,数组名是一个指针常量,指向不能发生修改,形如:str1++,str1=str1+1;str4++;都是错误的,而str5++;str5=str5+1是合法的,这也是字符串两种赋值方式的其中一点不同之处),在传入strlen函数时,把数组名赋值给char * s变量 是可以的。
还有一个printf(“%s”,str1);//会输出abcd。底层原理,str1自动加1,把读取的元素,先缓存起来,直到遇到’\0’,时,把缓存起来的数据,打印到控制台上。
如果给上面的char b[] = {‘a’,‘b’,‘c’}; 使用 printf(“%s”,b);是不正规的,有的编译器会报错。正确的打印普通字符数组的方法是通过for循环,遍历打印。
还有形如: char * str5 = “中abc”;//就是这种字符串中含中文的,那么一个中文在UTF8编码下,这里占3个字节。用strlen计算其长度时出现6。而sizeof(str5) == 7; str5[0]的输出并不是“中”,而是中字所占的3个字节的,第一个字节。所以这里不能通过索引获取中文字。但是通过
printf(“=%s”,str5);//可以打印出 “中abc”,底层原理,将缓存起来的字节,按照unicode方式下的utf-8编码规则来解码,打印。