字符串,即把多个字符连在一起,并有顺序的存放。本文主要内容是辨析C语言中存储多字符的三种方式,及其特性。
Table of Contents
字符数组
字符串
字符串指针
辨析字符数组、字符串、指针字符串
字符数组:char str[]={‘h’,’a’,’h’,’a’};
字符串:char str[] = “haha”;
指针字符串:char *pstr = “haha”;
把多个字符顺序存放起来就是字符数组。但不论怎样操作,都只是在、而且仅能操作数组而已,就像操作int型数组、float型数组,所以字符数组里没有结束标志这一说法。
申明即初始化、遍历、获取单个元素:
//申明即初始化、遍历、获取单个元素
char CharacterArray1[5] = { 'a','b','c','d','e' };
int i;
for (i = 0; i < 5; i++) //遍历字符数组;
{
printf("%c", CharacterArray1[i]);
}
putchar('\n');
printf("下标为3的字符数组式:%c\n", CharacterArray1[3]); //获取字符数组里的元素,并输出;
putchar(CharacterArray1[3]); //输出下标为3的字符数组;
//字符数组使用%s输出,会有多余部分的错误输出;这时因为以%s(字符串)来解析的话,字符数组里始终没有结束标志!
//printf("%s\n",CharacterArray1); 输出有多余的错误部分;
先申明再初始化:
char CharacterArray2[5]; //申明
CharacterArray2[0] = 'a'; //对单个元素赋值;
CharacterArray2[0] = 'b';
字符数组不可调用字符串的库函数(如strlen)和%s解析方式,而只能以%c来解析!
char CharacterArray[] = { 'a','b','c','d','e' }; //字符数组
for (int i = 0; i < strlen(CharacterArray); i++)
{
printf("%c", CharacterArray[i]); //调用了strlen,输出了不可预料的多余部分!
}
1,把一个个的字符写成一个串,即为字符串;
2,字符串用双引号,是多个字符组成的串;字符用单引号,有且仅有一个字符;
3,用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0'。只有在字符串里才会有结束标志,而在字符数组里结束可以用下标来控制;
4,凡是字符串,一定要处理好结束标志:分割字符串以该标志为遍历的终结符、分割好了存于新串里要添加结束标志;
字符数组向字符串的转化
char CharacterArray[5] = { 'a','b','c','d','e' }; //字符数组
char String1[] = { "abcde" }; //字符串
//或写成:char String2[] = "abcde";
int i; //1,字符数组方式正常输出;
for (i = 0; i < strlen(String1); i++)
{
printf("%c", String1[i]);
}
printf("%s\n", String1); //2,字符串方式可以正常输出;
puts(String1); //3,调用字符串库函数输出;
String1[2] = ‘x’; //对字符串的指定下标位置重新赋值;
//字符串的操作方式完全兼容字符数组的操作方式,如下标取数、赋值;
字符串的结束标志
char CharacterArray[5] = { 'a','b','c','d','e' }; //字符数组
char String[5] = "abcd";
由于字符数组不需要结束标志而只依靠于下标即可完成所有操作,故其的容量就是存储的字符个数;字符串则需要一个单独的空间来保存结束标志’\0’,所以申请5个空间,实际只可用4个空间!
输出方式完全兼容字符数组和字符串:
char *sp = "ABCD";
printf("%c\n", sp[2]); //调用下标为2的元素;
printf("sp的元素个数是:%d\n", strlen(sp));
printf("%s\n", sp); //以字符串%s来解析输出;
puts(sp); //调用库函数输出;
指针字符串常量
char *str = "XXOO"; //XXOO是字符串常量,这个指针指向它;
puts(str);
str = "MMMM"; //对这个指针变量重新赋值,即改变指针的指向;
puts(str);
//str[2] = 'h';企图对字符串常量的第3个元素重新赋值,出错,编译能够通过,但是运行期间会发生段错误
putchar(str[2]);
puts(str);
字符串指针一旦初始化,不可对字符串里面的某个元素进行操作(赋值、删除);因为指针指向的是一个字符串常量!