在C语言中没有字符串类型(String),也没有字符串变量.
字符串是存放在字符型数组中的
用来存放字符数据的数组叫字符数组。
在字符数组中的一个元素内存放一个字符。
例如:
char a[12];
a[0]='I',a[1]=' ',a[2]='a',a[3]='m',a[4]=' ',a[5]='s',
a[6]='t',a[7]='u',a[8]='d',a[9]='e',a[10]='n',
a[11]='t',
以上定义了a为字符数组,包含11个元素。赋值以后数组的状态如图所示:
I | a | m | s | t | u | d | e | n | t |
其中没有字符的空表示输入的‘空格’
介绍完字符数组,在实际运用中需要用到这个该怎么使用呢?
初始化字符数组
最容易理解的方式就是“初始化列表”,把各个字符依次赋给数组中的各元素。
例如:
char a[12]={'I',' ','a','m',' ','s','t','u','d','e','n','t'}
把12个字符依次赋给a[0]-a[11]这12个元素。
如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
例如:
char a[ ]={'I',' ','a','m',' ','s','t','u','d','e','n','t'}
这里等同于上面的a[12]
这里简单介绍几种比较常用的输出字符数组的方式
char a[ ]={'I',' ','a','m',' ','s','t','u','d','e','n','t'}
我们最开始的根据字符一个一个的放入到字符数组中
然后用for循环将数组中的字符一个个遍历打印出来
例如:
char a [ ] = { 'I',' ','a','m',' ','s','t','u','d','e','n','t' };
for ( int i = 0; i < 12; i++ ) {
printf( "%c", a [ i ] );
}
可以直接省略花括号的方式,直接写成
char b [ ] = "I am student"
然后用for循环将数组中的字符一个个遍历打印出来
例如:
char b [ ] = "I am student";
for ( int i = 0; i < 13;i++ ) {
printf( "%c", b[ i ] );
}
这里不像第一种那样用单个字符作为字符数组的初值,
而是用一个字符串(注意字符串的两端是用双撇号""而不是单撇号'')作为初值。
显然这种方法直观、方便、符合人们的习惯
请注意此时的数组b长度已经不是12了,而是13。
因为字符串常量的最后由系统加上一个'\0'。
注意:C系统在用字符数组存储字符串常量时会自动加一个'\0'作为结束符
上面的初始化与下面的初始化等价:
char b [ ] = { 'I',' ','a','m',' ','s','t','u','d','e','n','t' ,'\0'};
而不与第一种等价,这么说会更好理解一些。
前者的长度为12,后者的长度为13.
这种调用起来会比较方便,不需要用for循环遍历,可以直接用printf语句输出
例如:
char c [ ] = { "I am student" };
printf( "%s",c);
这个就直接调用数组c这个对象进行输出。
而%s是用来输出字符串的格式符
printf( "%s",c);
实际上系统是这样执行的:
按字符数组名c找到其数组的第一个元素的地址,然后逐个输出其中的字符,
直到遇到'\0'(结束符)为止。
用%s输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。
写成下面这样是不对的:
printf( "%s",c[0]);
#include
int main( ) {
//第一种
char a [ ] = { 'I',' ','a','m',' ','s','t','u','d','e','n','t' };
for ( int i = 0; i < 12; i++ ) {
printf( "%c", a [ i ] );
}
printf( "\n" );
printf( "===================\n" );
//第二种
char b [ ] = "I am student";
for ( int i = 0; i < 13;i++ ) {
printf( "%c", b[ i ] );
}
printf( "\n" );
printf( "===================\n" );
//第三种
char c [ ] = { "I am student" };
printf( "%s\n",c);
printf( "===================\n" );
return 0;
}
以下是三种方式的输出效果:
这里是我本人的理解,如果有不对的地方,欢迎指正!