在 C 语言中,由于没有字符串这个变量类型, 所以字符串是存放在字符串数组中的。
如果我们想引入一个字符串,有以下两种方式。
1.用字符数组存放一个字符串,可以通过数组名和下标引用字符串中的一个字符,也可以通过数组名和格式声明"%s"输出该字符串。
#include <stdio.h> int main(){ char string[] = "I love China!"; printf("%s\n",string); printf("%c\n",string[7]); return 0; }
这里,我们先解释下,字符串数组在内存中所占的字节数,
在上面例子中,我们可以得知,string变量的长度是13,但它的精确长度应该是14。
因为在内存中,最后一个字节存放着字符串的结束符'\0', 用于表示这个字符串的结束,
根据以前数组指针的概念,这里数组名string代表字符数组首元素的地址,
那么通过*string 就可以得到字符数组中第一个字符的值,
*(string+7) 就是字符数组中第7个字符的值。
这里我们要注意的是,当用指针方式取某一个字符时,前面的格式声明必须是 %c,而不是%s,
%s这个声明是获取整个字符数组的内容的,当遇到结束符'\0',是才会结束。
2.用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。
#include <stdio.h> int main(){ char * string = "I love China!"; printf("%s\n",string); return 0; }
在这里,我们并没有定义一个字符数组,只是定义了一个char * 型 变量(字符指针变量),用字符串"I love China!"对它初始化。
C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放该字符串常量,
但是这个字符数组是没有名字的,因此不能数组名来引用,只能通过指针变量来引用。
对于上述的字符串变量string的初始化,实际上是把字符串的第一个元素的地址(即存放字符串的字符数组的首元素地址)赋给指针变量string,使string指向字符串的第一个字符
在不至于误解的情况下,为了方便起见,有时也可以说,string指向字符串"I love China!",
但应该理解为指向字符串的第一个字符。
而printf("%s\n",string);
这条语句,就是打印出字符数组中所有的字符。
这里,我们可能有一些疑惑,首先,string是一个地址,我们在前面使用int类型的数组时,不是打印出它的地址的吗
而用取值符号 * 才是获取string的值啊。
但是,这里我们要记住,如果我们用* 来取值的话,那么前面的格式符号就一定是%c了。
因为 通过* 来取值的话,肯定是去字符数组中的一个字符元素了。
但如果我们直接使用%s,而后面直接跟上数组元素的首地址的话,
那么C解释器在解释这段代码是,会自动移动该字符指针的位置,将该字符指针对给定的值给输出来,
知道遇到结束符'\0',则停止。
下面我们给一个例子,具体的展示结束符的作用
例: 将字符串a复制为字符串b,然后输出字符串b。
#include <stdio.h> int main(){ char a[] = "I am a student.",b[20]; int i; for(i=0;*(a+i)!='\0';i++) *(b+i) = *(a+i); *(b+i) = '\0'; printf("string a is:%s\n",a); printf("string b is:"); for(i=0;b[i]!='\0';i++) printf("%c",b[i]); printf("\n"); return 0; }
上述例子中,我们定义了两个字符数组,一个有值,一个为空,
首先,我们循环字符数组里的值,我们用字符数组中最后一个结束符来判断循环的终止
并且在赋值结束时,我们给b添加一个结束符'\0',
如此,我们就可以输出b的值了。
上述的例子也可以改成
#include <stdio.h> int main(){ char a[] = "I am a student.",b[20]; int i; for(i=0;*(a+i)!='\0';i++) *(b+i) = *(a+i); *(b+i) = '\0'; printf("string a is:%s\n",a); printf("string b is:%s\n",b); printf("\n"); return 0; }
接下来,我们通过用指针的方式来解决上述问题。
#include <stdio.h> int main(){ char a[]="I am a boy.",b[20],*p1,*p2; p1=a;p2=b; for(;*p1!='\0';p1++,p2++) *p2=*p1; *p2='\0'; printf("string a is:%s\n",a); printf("string b is:%s\n",b); return 0; }