1. 什么是字符串?有什么用?
字符串就是以空字符(’\0’)结尾的字符(char)数组。
字符串是文本数据,程序可以通过字符串来获取、处理以及输出文本数据。
2. 字符串的声明和定义方法。
常用的字符串声明和定义的方法有:字符串常量,char 数组,char 指针, 字符串数组 4 种。
(1)字符串常量(字符串文字)
字符串常量就是位于一对双引号中的任何字符。双引号里的字符加上编译器自动提供的结束标志符空字符(’\0’),作为一个字符串存储在内存里。
字符串常量属于静态存储类。
静态存储:当内容开始创建后存储在内存里时,在整个程序运行过程中,不管该内容被调用多少次,该内容在内存中只存储一份,调用时用指向该内容指针来传递。
定义范例:
char hello[50] = “hello world!”;
(2)char 数组
例:
char hello[50] = {‘h’, ‘e’, ‘l’, ‘l’ , ‘o’, ‘!’, ‘\0’};
指定数组大小时,一定要确保数组元素数比字符串长度至少多1(多出来的1个元素用来容纳空字符(’\0’)),未被使用的元素均被初始化为0,这里的0是 char 形式的空字符,而不是数字字符0.
数组的大小必须是整型数据,当初始化声明时,如果省略数组大小,则该大小由第一次定义的字符串大小决定。
char 数组操作同普通数组操作一样。
(3)char 指针
例:
char *str = “hello!”;
char 数组与 char 指针的不同
- 数组初始化是从静态存储区把一个字符串复制给数组,而指针初始化只是复制字符串的地址;
- 数组名是一个常量(但数组的元素是一个变量),而指针名是一个变量。
(4)字符串数组
例:
第一种:char * str1[3] = {“how”, “are”, “you?”};
第二种: char str2[3][4] ={“how”, “are”, “you?”};
两者的区别就是第二种方法建立了一个所有行相等的矩形数组,而第一种建立的是每一行都是初始化的字符串大小,是长短不一的不规则数组。
3. 字符串的输入
C库提供了3个读取字符串的函数:gets(), fgets() 和 scanf()。
(1) gets() 函数
头文件:stdio.h
函数原型: char * gets(char *s);
输入参数:可以是一个数组地址,也可以是空。
返回值:
如果成功读取到字符串,就返回获取到的字符串地址。
如果出错或者读取到文件结尾(EOF),就返回一个空指针NULL。
函数功能:它将读取换行符(’\n’)之前(不包括换行符)的所有字符,在这些字符后面添加一个空字符(’\0’),然后把这个字符串交给调用它的程序。它将换行符从输入缓存中读取出来并将其丢弃。
(2) fgets()函数
头文件:stdio.h
函数原型:char * fgets(char *s, int n, FILE *stream);
输入参数:有3个
第一个参数:存储字符串的字符串数组或地址。
第二个参数:指定最大读入字符数。如果这个参数为n,那么fgets()就会最多读取(n - 1)个字符或者读完一个换行符为止,由这两者谁先满足结束输入。
第三个参数:说明要读取哪个文件的字符串,从键盘输入读取数据时,可以使用 stdin 作为参数。
返回值:
如果成功读取到字符串,就返回获取到的字符串地址。
如果出错或者读取到文件结尾(EOF),就返回一个空指针NULL。
函数功能:如果第二个参数为n,那么fgets()就会最多读取(n - 1)个字符或者读完一个换行符为止,由这两者谁先满足结束输入。在这些字符后面添加一个空字符(’\0’),然后把这个字符串交给调用它的程序。
fgets() 与 gets() 函数的区别:
- fgets()限制读取字符串的字符个数,而gets()是遇到换行符时才结束读取。fgets()防止了gets()的内存溢出问题。
- fgets()函数会读取换行符并加入到字符串中,而gets()函数会读取换行符但是会丢弃掉。
(3) scanf()函数
头文件:stdio.h
函数原型:int scanf ( const char *format, …);
输入参数:格式字符串(字符串输入格式符为%s,或者%3s中间的数字代表允许读入的最大字符数),存储的地址
返回值:
如果读取成功,就返回读取数据成功的个数
如果读取失败或读取到文件结尾(EOF)时,就返回NULL。
函数功能:从第一个非空字符开始,如果使用%s格式,字符串读到(但不包括)下一个空白字符(如空格,制表符或换行符),如果指定了字段宽度,如 %10s ,就会读入10个字符或者遇到第一个空白字符,由这两者的第一个终止输入。scanf()不会读取空白符,空白字符会保留在输入流中。
4. 字符串的输出
C有三个用于输出字符的标准库函数:puts(), fputs() 和 printf().
(1) puts() 函数
头文件:stdio.h
函数原型:int puts ( const char *s);
输入参数:要输出字符串的地址
返回值:0
函数功能:送一字符串到流stdout中。puts()函数输出字符串时依次输出字符串中的字符,直到遇到一个空字符后自动在后面添加一个换行符后停止输出。因此puts()函数输出的字符串都是单行显示。
(2) fputs() 函数
头文件:stdio.h
函数原型:int fputs ( const char *s, FILE *stream);
输入参数:参1:要输出字符串的地址, 参2:要写入字符串的文件,屏幕输出用stdout
返回值:0
函数功能:送一字符串到输出流中。fputs()函数输出字符串时依次输出字符串中的字符,直到遇到一个空字符后停止输出。fputs()函数不会自动添加换行符。
(3) printf() 函数
格式化输出,输出字符串用 %s 格式,与之对应的是一个字符串地址作为参数。
4. 命令行参数
现代的图形界面出现之前是命令行界面。DOS和UNIX就是例子。命令行是在一个命令行环境下,用户输入的用于运行程序的行。
C编译器允许main() 函数没有参数或则有两个参数。当有两个参数时,一般为: int main(int argc, char *argv[]);
参数1: 为int 类型,表示命令行中的字符串的个数。系统使用空格来判断一个字符串结束,另一个字符串开始。
参数2: 为一个指向字符串的指针数组,命令行中的每个字符串被存储到内存中,并且分配一个指针指向它,把程序本身的名字赋值给argv[0],接着,把随后的一个字符串赋值给argv[1],依次类推。然后在程序中就可以处理这些命令行参数。
5. 字符串函数
(1) char * strcpy (char * s1, const char * s2);
该函数把s2指向的字符串(包括空字符)复制到s1指向的位置,返回值是s1。
(2) char * strncpy ( char * s1, const char * s2, size_t n);
该函数把s2指向的字符串复制给s1指向的位置,复制的字符数不超过n个,返回值是s1。空字符后的字符不被复制。如果源字符串的字符数少于n个,在目标字符串中就以空字符填充。如果源字符串字符数大于或等于n个时,空字符就不被复制,返回值是s1。
(3) char * strcat ( char * s1, const char * s2);
s2指向的字符串被复制到s1指向字符串的结尾。复制过来的s2所指字符串的第一个字符覆盖了s1所指字符串结尾的空字符,返回值是s1。
(4) char * strncat ( char * s1, const char * s2, size_t n);
s2字符串只有前n个字符被追加到s1字符串中,复制过来的s2字符串的第一个字符覆盖了s1所指字符串结尾的空字符,s2字符串中的空字符及其后的任何字符都不会被复制,并且追加一个空字符到所得结果后面,返回值是s1。
(5) int strcmp ( const char * s1, const char * s2);
比较的是字符串中第一对不同的两个字符字符。如果s1字符串在机器编码顺序中落后于s2字符串看,函数就返回一个正数;如果两个字符串相同,函数返回值就为0;如果s1字符串在机器编码顺序中先与第二个字符串,返回值就是一个负数。常用来比较两个字符串是否完全相等。
(6) int strncmp( const char * s1, const char * s2, size_t n);
该函数作用同strcmp()函数一样,只是比较n个字符后或者遇见第一个空字符时会停止比较,由两者中最先满足条件的那个终止比较。
(7) char * strchr ( const char * s, int c);
该函数返回一个指向字符串s中存放字符c的第一个位置的指针(标志结束的空字符是字符串的一部分,因此也可以搜索到它)。如果没有找到该字符,函数就返回一个空指针NULL。
(8) char * strpbrk ( const char * s1, const char *s2);
该函数返回一个指针,指向字符串s1中存放s2字符串中的任何字符的第一个位置。如果没找到任何字符,函数就返回一个空指针NULL。
(9) char * strrchr ( const char * s, int c);
该函数返回一个指针,指向s字符串中字符c最后一次出现的位置(标志结束的空字符是字符串的一部分,因此也可以搜索到它)。如果没有找到该字符,函数就返回一个空指针NULL。
(10) char * strstr ( const char * s1, const char * s2);
该函数返回一个指针,指向s1字符串中第一次出现s2字符串的地方,如果s1中没有找到s2字符串,函数就返回一个空指针NULL。
(11) size_t strlen ( const char * s);
该函数返回s字符串中的字符个数,其中不包含标志结束的空字符(’\0’)。
(12) ctype.h 字符判断函数见第7章表7.1。P158
(13)int atoi ( const char * nptr); P314
该函数把nptr字符串中从第一个非空字符开始,如果第一个遇到的字符为数字字符则同后面相邻的数字字符组合在一起转换为数值并返回。如果字符串中第一个非空字符不是数字字符或者没有可转换的数字字符,该函数就返回0。