字符串在末尾都默认有一个’\0’作为结束符。　方法.　用字符串初始化字符数组　获取字符串长度　sizeof运算符也可以用来求字符串的长度,例如sizeof(‘abcde’)。还可以使用strlen()函数来获取字符串长度,　strten()函数原型如下:unsigned　int　strlen(char　*s)　其中s是指向字符串的指针,返回值是字符串的长度。需要注意的是,使用strlen()函数得到的字符串的长度并不包括末尾的空字符‘\0’　strlen()与sizeof运算符的区别,具体如下:　sizeof()是运算符;　strlen()是　C语言标准库函数,包含在string.h头文件;　sizeof()的功能是获得所建立对象的字节大小,计算类型所占内存;　strlen()时获得字符串所占内存的有效字节数;　sizeof运算符的参数可以是数组、指针、类型、对象和函数;strlen()函数的参数是指向以’\0’结尾的字符串的指针;　sizeof()运算符计算大小在编译时就完成,因此不能用来计算动态分配内存的大小,strlen()函数结果要在运行时才能计算出来。　字符串与指针　在C语言中,字符型指针用char*来定义,它不仅可以指向一个字符型常量,还可以指个字符串。　字符数组与字符指针:字符串用字符数组存储,也可以取数组地址赋值给字符型指针。以下为两者的区别与联系:　(1)存储方式　字符数组在用字符串初始化时,这个字符串就存放在了字符数组开辟的内存空间中;而字符指针变量在用字符串常量初始化时,指针变量中存储的是字符串的首地址,但字符串存储在常量区。　上面的文字描述有些晦涩,下面通过一段示例代码来辅助理解,具体如下:　存储在栈区、堆区和静态区上的数据是可更改的,存储在常量区的数据只能在定义时赋值,且一旦赋值就不能再改变。　(2)初始化及赋值方式　初始化方式:可以对字符指针变量赋值,但不能对数组名赋值。　char　str[(6]　="hello";//char　str[6];　str="hello",这种写法错误　char　*p=　"hello"　//等价于char*p;　p　=　"hello";　赋值方式:使用数组定义的字符串只能通过为数组中的元素逐一赋值或通过调用复制函数的方式来赋值,而使用指针定义的字符串还可以实现直接赋值。　char　p1　=　"hello",　*p2;　p2　=　p1;char　str1[6]="hello",str2[6];　不可写成str1=str2,不可数组赋值　(3)字符指针与数组名字符指针变量的值是可以改变的,而数组名是一个指针常量,其值不可以改　变。　(4)字符串中字符的引用:可以用下标法和地址法引用数组元素和字符串中的字符元素。　gets()函数与puts()函数　(1)gets()函数读入用户输入的字符串时,会读取换行符之前所有的字符(不包括换行符本身),并在字符串的末尾添加一个空字符’\0’用来标记字符串的结束,读取到的字符串会以指针形式返回。　原型:char*　gets(char*　str)　(2)puts()函数接收的参数是一个字符串指针,该指针指向要输出的字符串,并且会自动在字符串末尾追加换行符"\n’。如果调用成功则　返回一个int类型的整数　,否则返回EOF　原型:int　puts(const　char*　str)　==puts()函数相比,　printf()函数不会一次输出一整行字符串,而是根据格式化字符串输出一个个“单词”。由于进行了额外的数据格式化工作,　printf()函数比puts()函数效率稍低。然而print()函数可以直接输出各种不同类型的数据,因此printf()函数比puts()函数应用更为广泛。　字符串连接函数　在程序开发中,可能需要对两个字符串进行连接,例如将电话号码和相应的区号进行连接。就务调商　为此,　C语言提供了strcat)函数和strncat)函数来实现连接字符串的操作,这两个函数的相关解具体如下:　strcat()函数　strcat()函数的用法很简单,它用来实现字符串的连接,即将一个字符串接到另一个字符串的后面。其函数原型如下所示:　chat*　strcat　(char*　dest,　const　char*　src);　表示将指针src指向的字符串接到指针dest指向的字符串之后。需要注意的是,在使用　strcat()函数之前,　dest对应的字符数组必须要有足够的空间来容纳连接之后的字符串,否则会发生缓冲区溢出的问题　strncat()函数　为了解决使用strcat()函数实现字符串连接时出现的“缓冲区溢出”问题,C语言提供了　strncat()函数。其函数原型如下:　char*　strncat　(char*　dest,　const　char*　src,　size_t　n);　strncat()函数除了接收两个字符指针src和dest之外,还接收第三个参数n,该函数的功能是:获取src所指字符串中的前n个字符,添加到dest所指字符串的结尾,覆盖dest所指字串结尾的’\0’,实现字符串拼接。　字符串复制函数　strcpy()函数,该函数专门用于实现字符串的复制,其函数原型如下:　char*　strcpy　(char*　dest,　const　char*　src);　参数dest和src可以在字符串中的任意一个位置,字符串指针src所指向的字符串将被复制到dest所指向的字符串中。　字符串比较函数　(1)strcmp()函数:比较两个字符串,其函数原型如下所示:　int　strcmp　(const　char*　str1,　const　char*　str2);　(2)strncmp()函数:比较两个字符串的前n个字符。其函数原型如下所示:　int　strncmp　(const　char*　strl,　const　char*　str2,　size_t　n);　strncmp()函数指定比较前n个字符,如果　str1和str2的前n个字符相同,则函数返回值为0。　选择排序算法:是在每一趟排序过程中从待排序记录中选择出最大(小)的元素,将其依次放在数组的最前或最后端的排序方法。　字符串查找函数　(1)　strchr()函数　strchr()函数用来查找指定字符在指定字符串中第一次出现的位置,其函数原型如下所示;　char*　strchr　(const　char*　str,　char　c);　其中参数str为被查找的字符串,　c是指定的字符。如果字符串str中包含字符c,　strchr()函数将返回一个字符指针,该指针指向字符c第一次出现的位置;否则返回空指针。　(2)　strrchr()函数　strrchr()函数用来查找指定字符在指定的字符串中最后一次出现的位置,其函数原型如所示:　char*　strrchr　(const　char*　str,　char　c);　其中参数str为被查找的字符串,　c是指定的字符。如果字符串str中包含字符c,strrchr()　函数将返回一个字符指针,该指针指向字符c最后一次出现的位置,否则返回空指针。　(3)　strstr()函数　上面两个函数都只能搜索字符串中的单个字符,如果要　在字符串中搜索是否包含一个子字符串　时,可以使用strstr()函数,其函数原型如下所示:　char　*strstr　(const　char　*haystack,　const　char　*needle);　其中参数haystack是被查找的字符串,　needle是子字符串。如果在字符串haystack到了字符串needle,则返回子字符串的指针,否则返回空指针。　字符串的其他常用函数　(1)atoi()函数　atoi()函数用于将一个数字字符串转换为对应的十进制数,其函数原型如下所示.　int　atoi　(const　char*　str);　atoi()函数接收一个数字字符串作为参数,返回转换后的十进制整数。如果转换失败,则返回0。需要注意的是,　atoi()函数的声明位于stdlib中(2)itoa()函数　用来将一个整数转换为不同进制下的字符串,其函数原型如下所示:　char*　itoa　(int　val,　char*　dst,　int　radix)　第一个参数val表示的是待转换的数,第二个素表示的是目标字符数组,第三个参数表示的是要转换的进制。　(3)sprintf()函数　字符串格式化命令,主要功能是把格式化的数据写入某个字符串中.　sprintf()函数和printf()函数都是变参函数。其函数原型如下所示:　int　sprintf(　char　*buffer,　const　chat　"Eormat,　[　argument]…);　第一个参数表示目标字符数组,第二个参数表示格式化字符串,第三个参数表示需要转换的整数。　编译和预处理(…)　结构体和共用体(…)　文件　计算机中的流　在C语言中,将在不同的输入/输出等设备(键盘、内存、显示器等)之间进行传递的数据抽象为“流”。例如,当在一段程序中调用scanf()函数时,会有数据经过键盘流入存储器;当调用printf()函数时,会有数据从存储器流向屏幕。流实际上就是一个字节序列,输入函数的字节可被称为输出流。　根据数据形式,输入输出流可以被细分为文本流(字符流)和二进制流。