二维数组所谓二维数组其本质就是一个一维数组只不过它的每一个元素都是一个一维数组int a[5];定义了一个数组数组名为a数组a一共有5个int类型的元素分别是a[0], a[1], a[2], a[3], a[4]那么我们在定义数组变量a的同时也声明了一个新的类型像a这样的类型 int [5]typeof(a) // int [5]typeof(a) b; // int [5] b; int b[5];// int[5] c; // 编译器不支持这样的写法// int c[5]; // 只能写成这样的形式假设我们现在要定义4个这样的 int [5] 这样的类型的数据该如何定义我们说如果要定义相同类型的变量可以用数组的形式来定义定义一维数组的语法形式类型说明符 数组名[整形表达式] { {初始化列表}}; // { {初始化列表}}表示可选那么定义二维数组时是不是也是一样的语法形式int [5] a[4]; int a[4][5];int b[3][4];数组名为bb[0] 里面包含有4个int类型的元素同时b[0]也是一个一维数组数组名为b[0]b[1] 里面包含有4个int类型的元素同时b[1]也是一个一维数组数组名为b[1]b[2] 里面包含有4个int类型的元素同时b[2]也是一个一维数组数组名为b[2]请注意我们b的真正含义是b是一个拥有3个元素的一维数组这个一维数组中每一个元素都是一个int [4]类型的一维数组。所以我们可以总结得到在C语言中二维数组本质上就是一个一维数组只不过该一维数组中的每一个元素都是一个一维数组。我们为了方便理解一般将 int b[3][4]; 理解为一个3行4列的矩阵。在C语言中我们还有三维数组、四维数组、...、n维数组其实本质上都是一个一维数组。例如int a[2][3][4];我们为了方便理解一般将 int a[2][3][4]; 理解为一个2层3行4列的立方体。2代表的是立方体的高3代表宽4代表长。本质上a就是一个拥有2个元素的一维数组每一个元素又是一个3行4列的二维数组。二维数组的定义类型说明符 数组名[整型表达式m][整型表达式n] { {初始化列表}}; // { {初始化列表}}表示可选代表多少行 代表多少列类型说明符指定二维数组中元素的类型而不是一维数组/二维数组的类型可以是C语言中任意合法的类型(基本类型以及自定义的构造类型、指针类型)数组名对象的名字。也是标识符的一种。整型表达式指定数组中的元素的个数分为 多少行 和 多少列元素的个数为 m * n。C语言中规定在定义数组时需要指定数组元素的个数常量表达式二维数组的引用数组名[第几行][第几列];下标第几行、第几列C语言中规定数组元素的下标是从0开始的并且下标越界编译器不做检查。如果下标越界结果未定义。如a[3][4]数组中元素的引用a[0][0], a[0][1], a[0][2], a[0][3], a[1][0], ... , a[2][3]引用二维数组的元素和引用普通变量也是一样的它也有左值和右值int a[3][4];int b;a[0][2] 1024; // a[0][2] 代表数组中的第0行第2列元素的地址充当左值b a[0][2]; // a[0][2] 代表数组中的第0行第2列元素的值充当右值二维数组的初始化我们可以在定义二维数组的时候用{}来给二维数组进行初始化给每个元素都初始化或者部分元素初始化1) 按行给二维数组赋初值int b[3][4] {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};2) 将所有的数据写在一个花括号内按数组的排列顺序对每个元素赋初值int b[3][4] {1,2,3,4,5,6,7,8,9,10,11,12};3) 对部分元素初始化其余元素自动置零int b[3][4] {1,2,3,4}; {{1,2,3,4}, {0,0,0,0}, {0,0,0,0}};int b[3][4] {{1}, {5,6}, {11,12}}; {{1,0,0,0}, {5,6,0,0}, {11,12,0,0}};4) 如果对全部的元素都赋初值则定义数组时可以省略第一维的长度(行)但是第二维的长度(列)不能省略int b[][4] {1,2,3,4,5,6,7,8,9,10,11,12};int b[][4] {1,2,3,4,5,6,7,8,9,10}; {{1,2,3,4}, {5,6,7,8}, {9,10,0,0}};注意只可以在定义数组的时候指定数组的全部元素的值。int b[3][4] {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; // rightint b[3][4];b[3][4] {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; // errorb {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; // error不能对数组进行整体赋值只允许在定义数组时指定数组整体的初始值二维数组在内存中的存放在C语言中用一组地址连续的空间从低地址到高地址依次保存数组中的每一个元素的值。例假设在32编译器下int占4个字节(32位)int b[3][4];b[0][0] 0x10 00 00 00 0x10 00 00 00 0 * sizeof(int)b[0][1] 0x10 00 00 04 0x10 00 00 00 1 * sizeof(int)b[0][2] 0x10 00 00 08 0x10 00 00 00 2 * sizeof(int)b[0][3] 0x10 00 00 0c 0x10 00 00 00 3 * sizeof(int)b[1][0] 0x10 00 00 10 0x10 00 00 10 0 * sizeof(int)b[1][1] 0x10 00 00 14 0x10 00 00 10 1 * sizeof(int)b[1][2] 0x10 00 00 18 0x10 00 00 10 2 * sizeof(int)b[1][3] 0x10 00 00 1c 0x10 00 00 10 3 * sizeof(int)b[2][0] 0x10 00 00 20 0x10 00 00 20 0 * sizeof(int)b[2][1] 0x10 00 00 24 0x10 00 00 20 1 * sizeof(int)b[2][2] 0x10 00 00 28 0x10 00 00 20 2 * sizeof(int)b[2][3] 0x10 00 00 2c 0x10 00 00 20 3 * sizeof(int)数组名代表数组的首元素的首地址也就是第一个元素的地址。b[0] b[0][0] 代表第一行的第一个元素的地址 int * (指向int类型的指针)b b[0] 代表二维数组的第一个元素的地址 int(*)[4] (指向int [4]类型的指针)b 代表整个二维数组的地址 int(*)[3][4] (指向int [3][4]类型的指针)数组类型int b[3][4];定义了一个数组数组名为b数组b一共有3个int [4]类型的元素分别是b[0], b[1], b[2]那么我们在定义数组变量b的同时也声明了一个新的类型像b这样的类型 int [3][4]typeof(b) // int [3][4]typeof(b) c; // int [3][4] c; int c[3][4];// int [3][4] d; // 编译器不支持这样的写法// int d[3][4]; // 只能写成这样的形式7、 字符数组所谓字符数组就是指数组的每一个元素都是一个字符例如char a[10];在C语言中没有专门的字符串类型如果需要表示字符串一般用如下两种方法字符数组字符指针如果一个字符数组的最后一个元素为\0则该字符数组就可以表示为一个字符串例如char c[5] {h, e, l, l, o}; // 字符数组char c[] {h, e, l, l, o, \0}; // 字符数组可以表示为字符串大小为6字符数组除了可以单个字符的初始化还可以进行整体的初始化例如char a[] {hello}; // sizeof(a) 6char a[] world; // sizeof(a) 6char a[] hello world // sizeof(a) 12char b[6];b hello; // error 数组名代表数组的首地址也就是第一个元素的地址不允许修改char c[100] hello;sizeof(c) 100sizeof(hello) 6strlen(c) 5strlen(hello) 58、 字符串的相关操作函数strlen()strcpy()strcmp()strcat()puts()gets()1) 用gets和puts对字符串进行输入输出例如char str[10] {0};gets(str); // 从键盘上获取一个字符串保存到str指向的内存空间中去puts(str); // 把str指向的空间中保存的字符串打印到终端puts()函数原型 int puts(const char *s);头文件 #include stdio.h功能 向标准输出写入一个字符串并且在末尾自动添加一个换行符 \n。参数 s 是指向 以\0结尾的字符串 的指针返回值 成功时返回非负值(通常为0)失败时返回EOF(同于表示数据读取结束的特殊标志通常为 -1)。例子puts(Hello World!); // 输出一个Hello World!并换行注意1、字符串末尾\0不会被输出但是会自动添加一个换行符2、等价于 fputs(str, stdout); 后再输出\ngets()函数原型 char *gets(char *s);头文件 #include stdio.h功能 从标准输入读取一行字符串直到遇到换行符\n并将换行符丢弃在字符串末尾添加一个\0参数 s 是指向 保存输入字符串的字符数组 的指针返回值 成功时返回 s失败时或者遇到 EOF 时返回NULL例子char b[100] {0};gets(b); // 读取一行输入(不会读取\n同时添加一个\0)puts(b); // 输出读取到的字符串(不会输出\0同时添加一个\n)((.text0x48): 警告 the gets function is dangerous and should not be used.)注意1、 gets本身有巨大的BUGgets不会考虑保存 你输入的字符串 的数组 的空间大小如果超出了分配范围还会继续写入数据可能会改变别的变量的数值甚至可能造成段错误。2、 gets函数不会获取到字符\nputs函数在输出时会自动添加一个换行符\n。3、 gets函数获取字符串时可以获取空格、TAB等空白字符遇到回车结束输入而scanf函数是遇到空格、TAB等空白符和回车就结束输入。建议尽量不要使用这个函数而是使用fgets代替使用fgets()函数原型 char *fgets(char *s, int size, FILE *stream);头文件 #include stdio.h功能 从 文件流stream 中读取 size - 1 个字符保存到 s 所指向的内存空间参数 s 数据缓冲区首地址如果是用数组来保存字符串此处就写数组名即可size 表示最多从文件流中读取 size - 1 个字符如果是按换行结束输入则\n也会保存到数组中最后会自动添加一个\0作为字符串结束标志stream 文件流指针如果要用它表示标准输入(键盘)写stdin即可返回值 成功时返回 s失败时或者遇到 EOF 时返回NULL例如char b[100] {0};fgets(b, 100, stdin);2) strlen() 求字符串长度strlen()函数原型 size_t strlen(const char *s);头文件 #include string.h功能 用于计算字符串长度不包括结束标志\0参数 s 表示字符串的起始地址如果是用字符数组来保存字符串此处写数组名即可返回值 字符串实际的字符个数(不包括\0)代码实现其运行结果为3) strcpy() / strncpy() 拷贝字符串strcpy()函数原型 char *strcpy(char *dest, const char *src);头文件 #include string.h功能 用来把 src 指向的那个字符串拷贝 dest 指向的内存空间中去直到遇到 src 的\0就停止拷贝(\0也会拷贝)。参数 dest 指向用来保存字符串的内存空间一定要保证空间足够大src 指向要拷贝的字符串返回值 成功返回拷贝后字符串的首地址其实就是 dest 所指向的字符串失败则返回NULL代码实现其运行结果为注意strcpy 函数也有一个BUG不关心 dest 指向的内存空间是否够用可能造成内存溢出strncpy 正是为了修复这个BUG它的功能和 strcpy 相似只不过它顶多拷贝 n 个字节strncpy()函数原型 char *strncpy(char *dest, const char *src, size_t n);头文件 #include string.h功能 用来把 src 指向的那个字符串拷贝 dest 指向的内存空间中去顶多拷贝 n 个字节。参数 dest 指向用来保存字符串的内存空间src 指向要拷贝的字符串n 最多拷贝 n 个字节返回值 成功返回拷贝后字符串的首地址其实就是 dest 所指向的字符串失败则返回NULL代码实现其运行结果为4) strcat() / strncat() 追加字符串strcat()函数原型 char *strcat(char *dest, const char *src);头文件 #include string.h功能 用来把 src 指向的那个字符串追加到 dest 指向的字符串的末尾(覆盖掉 dest 的\0)直到遇到 src 的字符串结束标志\0才结束追加(\0也会追加)。参数 dest 指向用来保存字符串的内存空间一定要保证空间足够大src 指向要追加的字符串返回值 成功返回追加后字符串的首地址其实就是 dest 所指向的字符串失败则返回NULL代码实现其运行结果为注意strcat 把 src 指向的字符串从在 dest 当中遇到的第一个\0开始追加直到遇到 src 的字符串结束标志\0才结束追加。所以strcat 函数也存在一个BUG不关心 dest 所指向的内存空间是否够用可能造成内存溢出strncat 正是为了修复这个BUG它的功能和 strcat 相似只不过它顶多追加 n 个字节strncat()函数原型 char *strncat(char *dest, const char *src, size_t n);头文件 #include string.h功能 用来把 src 指向的那个字符串追加到 dest 指向的字符串的末尾(覆盖掉 dest 的\0)顶多追加 n 个字节参数 dest 指向用来保存字符串的内存空间src 指向要追加的字符串n 最多追加 n 个字节返回值 成功返回追加后字符串的首地址其实就是 dest 所指向的字符串失败则返回NULL代码实现其运行结果为注意 strncat到底追加多少个字节(1) 在追加完 n 个字节前遇到\0追加结束(\0也会被追加)后面的就不管了。(2) 在追加完 n 个字节前没遇到\0但是已经追加了 n 个字节了结束追加。(同时自动补一个\0)5) strcmp() / strncmp() 比较字符串 无BUGstrcmp()函数原型 int strcmp(const char *s1, const char *s2);头文件 #include string.h功能 用来比较 s1 和 s2 两个字符串参数 s1 表示要进行比较的字符串1 的首地址s2 表示要进行比较的字符串2 的首地址返回值 如果 s1 大于 s2则返回一个正数如果 s1 等于 s2则返回一个0如果 s1 小于 s2则返回一个负数字符串的比较规则逐个字符依次进行比较比较每个字符的ASCII码如果两个字符串的第一个字符相同则再比较两个字符串中的第二个字符如果第二个也相同则再比较第三个依次类推。直到两个字符串的对应位置的字符不相同或者其中一个字符串遍历完成那么就返回这两个不相同字符的ASCII码的差值。代码实现其运行结果为strncmp()函数原型 int strncmp(const char *s1, const char *s2, size_t n);头文件 #include string.h功能 用来比较 s1 和 s2 两个字符串只不过只比较前面 n 个字节参数 s1 表示要进行比较的字符串1 的首地址s2 表示要进行比较的字符串2 的首地址n 表示只比较前面 n 个字节返回值 如果 s1 大于 s2则返回一个正数如果 s1 等于 s2则返回一个0如果 s1 小于 s2则返回一个负数代码实现其运行结果为
C语言:二维数组与字符串
二维数组所谓二维数组其本质就是一个一维数组只不过它的每一个元素都是一个一维数组int a[5];定义了一个数组数组名为a数组a一共有5个int类型的元素分别是a[0], a[1], a[2], a[3], a[4]那么我们在定义数组变量a的同时也声明了一个新的类型像a这样的类型 int [5]typeof(a) // int [5]typeof(a) b; // int [5] b; int b[5];// int[5] c; // 编译器不支持这样的写法// int c[5]; // 只能写成这样的形式假设我们现在要定义4个这样的 int [5] 这样的类型的数据该如何定义我们说如果要定义相同类型的变量可以用数组的形式来定义定义一维数组的语法形式类型说明符 数组名[整形表达式] { {初始化列表}}; // { {初始化列表}}表示可选那么定义二维数组时是不是也是一样的语法形式int [5] a[4]; int a[4][5];int b[3][4];数组名为bb[0] 里面包含有4个int类型的元素同时b[0]也是一个一维数组数组名为b[0]b[1] 里面包含有4个int类型的元素同时b[1]也是一个一维数组数组名为b[1]b[2] 里面包含有4个int类型的元素同时b[2]也是一个一维数组数组名为b[2]请注意我们b的真正含义是b是一个拥有3个元素的一维数组这个一维数组中每一个元素都是一个int [4]类型的一维数组。所以我们可以总结得到在C语言中二维数组本质上就是一个一维数组只不过该一维数组中的每一个元素都是一个一维数组。我们为了方便理解一般将 int b[3][4]; 理解为一个3行4列的矩阵。在C语言中我们还有三维数组、四维数组、...、n维数组其实本质上都是一个一维数组。例如int a[2][3][4];我们为了方便理解一般将 int a[2][3][4]; 理解为一个2层3行4列的立方体。2代表的是立方体的高3代表宽4代表长。本质上a就是一个拥有2个元素的一维数组每一个元素又是一个3行4列的二维数组。二维数组的定义类型说明符 数组名[整型表达式m][整型表达式n] { {初始化列表}}; // { {初始化列表}}表示可选代表多少行 代表多少列类型说明符指定二维数组中元素的类型而不是一维数组/二维数组的类型可以是C语言中任意合法的类型(基本类型以及自定义的构造类型、指针类型)数组名对象的名字。也是标识符的一种。整型表达式指定数组中的元素的个数分为 多少行 和 多少列元素的个数为 m * n。C语言中规定在定义数组时需要指定数组元素的个数常量表达式二维数组的引用数组名[第几行][第几列];下标第几行、第几列C语言中规定数组元素的下标是从0开始的并且下标越界编译器不做检查。如果下标越界结果未定义。如a[3][4]数组中元素的引用a[0][0], a[0][1], a[0][2], a[0][3], a[1][0], ... , a[2][3]引用二维数组的元素和引用普通变量也是一样的它也有左值和右值int a[3][4];int b;a[0][2] 1024; // a[0][2] 代表数组中的第0行第2列元素的地址充当左值b a[0][2]; // a[0][2] 代表数组中的第0行第2列元素的值充当右值二维数组的初始化我们可以在定义二维数组的时候用{}来给二维数组进行初始化给每个元素都初始化或者部分元素初始化1) 按行给二维数组赋初值int b[3][4] {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};2) 将所有的数据写在一个花括号内按数组的排列顺序对每个元素赋初值int b[3][4] {1,2,3,4,5,6,7,8,9,10,11,12};3) 对部分元素初始化其余元素自动置零int b[3][4] {1,2,3,4}; {{1,2,3,4}, {0,0,0,0}, {0,0,0,0}};int b[3][4] {{1}, {5,6}, {11,12}}; {{1,0,0,0}, {5,6,0,0}, {11,12,0,0}};4) 如果对全部的元素都赋初值则定义数组时可以省略第一维的长度(行)但是第二维的长度(列)不能省略int b[][4] {1,2,3,4,5,6,7,8,9,10,11,12};int b[][4] {1,2,3,4,5,6,7,8,9,10}; {{1,2,3,4}, {5,6,7,8}, {9,10,0,0}};注意只可以在定义数组的时候指定数组的全部元素的值。int b[3][4] {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; // rightint b[3][4];b[3][4] {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; // errorb {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; // error不能对数组进行整体赋值只允许在定义数组时指定数组整体的初始值二维数组在内存中的存放在C语言中用一组地址连续的空间从低地址到高地址依次保存数组中的每一个元素的值。例假设在32编译器下int占4个字节(32位)int b[3][4];b[0][0] 0x10 00 00 00 0x10 00 00 00 0 * sizeof(int)b[0][1] 0x10 00 00 04 0x10 00 00 00 1 * sizeof(int)b[0][2] 0x10 00 00 08 0x10 00 00 00 2 * sizeof(int)b[0][3] 0x10 00 00 0c 0x10 00 00 00 3 * sizeof(int)b[1][0] 0x10 00 00 10 0x10 00 00 10 0 * sizeof(int)b[1][1] 0x10 00 00 14 0x10 00 00 10 1 * sizeof(int)b[1][2] 0x10 00 00 18 0x10 00 00 10 2 * sizeof(int)b[1][3] 0x10 00 00 1c 0x10 00 00 10 3 * sizeof(int)b[2][0] 0x10 00 00 20 0x10 00 00 20 0 * sizeof(int)b[2][1] 0x10 00 00 24 0x10 00 00 20 1 * sizeof(int)b[2][2] 0x10 00 00 28 0x10 00 00 20 2 * sizeof(int)b[2][3] 0x10 00 00 2c 0x10 00 00 20 3 * sizeof(int)数组名代表数组的首元素的首地址也就是第一个元素的地址。b[0] b[0][0] 代表第一行的第一个元素的地址 int * (指向int类型的指针)b b[0] 代表二维数组的第一个元素的地址 int(*)[4] (指向int [4]类型的指针)b 代表整个二维数组的地址 int(*)[3][4] (指向int [3][4]类型的指针)数组类型int b[3][4];定义了一个数组数组名为b数组b一共有3个int [4]类型的元素分别是b[0], b[1], b[2]那么我们在定义数组变量b的同时也声明了一个新的类型像b这样的类型 int [3][4]typeof(b) // int [3][4]typeof(b) c; // int [3][4] c; int c[3][4];// int [3][4] d; // 编译器不支持这样的写法// int d[3][4]; // 只能写成这样的形式7、 字符数组所谓字符数组就是指数组的每一个元素都是一个字符例如char a[10];在C语言中没有专门的字符串类型如果需要表示字符串一般用如下两种方法字符数组字符指针如果一个字符数组的最后一个元素为\0则该字符数组就可以表示为一个字符串例如char c[5] {h, e, l, l, o}; // 字符数组char c[] {h, e, l, l, o, \0}; // 字符数组可以表示为字符串大小为6字符数组除了可以单个字符的初始化还可以进行整体的初始化例如char a[] {hello}; // sizeof(a) 6char a[] world; // sizeof(a) 6char a[] hello world // sizeof(a) 12char b[6];b hello; // error 数组名代表数组的首地址也就是第一个元素的地址不允许修改char c[100] hello;sizeof(c) 100sizeof(hello) 6strlen(c) 5strlen(hello) 58、 字符串的相关操作函数strlen()strcpy()strcmp()strcat()puts()gets()1) 用gets和puts对字符串进行输入输出例如char str[10] {0};gets(str); // 从键盘上获取一个字符串保存到str指向的内存空间中去puts(str); // 把str指向的空间中保存的字符串打印到终端puts()函数原型 int puts(const char *s);头文件 #include stdio.h功能 向标准输出写入一个字符串并且在末尾自动添加一个换行符 \n。参数 s 是指向 以\0结尾的字符串 的指针返回值 成功时返回非负值(通常为0)失败时返回EOF(同于表示数据读取结束的特殊标志通常为 -1)。例子puts(Hello World!); // 输出一个Hello World!并换行注意1、字符串末尾\0不会被输出但是会自动添加一个换行符2、等价于 fputs(str, stdout); 后再输出\ngets()函数原型 char *gets(char *s);头文件 #include stdio.h功能 从标准输入读取一行字符串直到遇到换行符\n并将换行符丢弃在字符串末尾添加一个\0参数 s 是指向 保存输入字符串的字符数组 的指针返回值 成功时返回 s失败时或者遇到 EOF 时返回NULL例子char b[100] {0};gets(b); // 读取一行输入(不会读取\n同时添加一个\0)puts(b); // 输出读取到的字符串(不会输出\0同时添加一个\n)((.text0x48): 警告 the gets function is dangerous and should not be used.)注意1、 gets本身有巨大的BUGgets不会考虑保存 你输入的字符串 的数组 的空间大小如果超出了分配范围还会继续写入数据可能会改变别的变量的数值甚至可能造成段错误。2、 gets函数不会获取到字符\nputs函数在输出时会自动添加一个换行符\n。3、 gets函数获取字符串时可以获取空格、TAB等空白字符遇到回车结束输入而scanf函数是遇到空格、TAB等空白符和回车就结束输入。建议尽量不要使用这个函数而是使用fgets代替使用fgets()函数原型 char *fgets(char *s, int size, FILE *stream);头文件 #include stdio.h功能 从 文件流stream 中读取 size - 1 个字符保存到 s 所指向的内存空间参数 s 数据缓冲区首地址如果是用数组来保存字符串此处就写数组名即可size 表示最多从文件流中读取 size - 1 个字符如果是按换行结束输入则\n也会保存到数组中最后会自动添加一个\0作为字符串结束标志stream 文件流指针如果要用它表示标准输入(键盘)写stdin即可返回值 成功时返回 s失败时或者遇到 EOF 时返回NULL例如char b[100] {0};fgets(b, 100, stdin);2) strlen() 求字符串长度strlen()函数原型 size_t strlen(const char *s);头文件 #include string.h功能 用于计算字符串长度不包括结束标志\0参数 s 表示字符串的起始地址如果是用字符数组来保存字符串此处写数组名即可返回值 字符串实际的字符个数(不包括\0)代码实现其运行结果为3) strcpy() / strncpy() 拷贝字符串strcpy()函数原型 char *strcpy(char *dest, const char *src);头文件 #include string.h功能 用来把 src 指向的那个字符串拷贝 dest 指向的内存空间中去直到遇到 src 的\0就停止拷贝(\0也会拷贝)。参数 dest 指向用来保存字符串的内存空间一定要保证空间足够大src 指向要拷贝的字符串返回值 成功返回拷贝后字符串的首地址其实就是 dest 所指向的字符串失败则返回NULL代码实现其运行结果为注意strcpy 函数也有一个BUG不关心 dest 指向的内存空间是否够用可能造成内存溢出strncpy 正是为了修复这个BUG它的功能和 strcpy 相似只不过它顶多拷贝 n 个字节strncpy()函数原型 char *strncpy(char *dest, const char *src, size_t n);头文件 #include string.h功能 用来把 src 指向的那个字符串拷贝 dest 指向的内存空间中去顶多拷贝 n 个字节。参数 dest 指向用来保存字符串的内存空间src 指向要拷贝的字符串n 最多拷贝 n 个字节返回值 成功返回拷贝后字符串的首地址其实就是 dest 所指向的字符串失败则返回NULL代码实现其运行结果为4) strcat() / strncat() 追加字符串strcat()函数原型 char *strcat(char *dest, const char *src);头文件 #include string.h功能 用来把 src 指向的那个字符串追加到 dest 指向的字符串的末尾(覆盖掉 dest 的\0)直到遇到 src 的字符串结束标志\0才结束追加(\0也会追加)。参数 dest 指向用来保存字符串的内存空间一定要保证空间足够大src 指向要追加的字符串返回值 成功返回追加后字符串的首地址其实就是 dest 所指向的字符串失败则返回NULL代码实现其运行结果为注意strcat 把 src 指向的字符串从在 dest 当中遇到的第一个\0开始追加直到遇到 src 的字符串结束标志\0才结束追加。所以strcat 函数也存在一个BUG不关心 dest 所指向的内存空间是否够用可能造成内存溢出strncat 正是为了修复这个BUG它的功能和 strcat 相似只不过它顶多追加 n 个字节strncat()函数原型 char *strncat(char *dest, const char *src, size_t n);头文件 #include string.h功能 用来把 src 指向的那个字符串追加到 dest 指向的字符串的末尾(覆盖掉 dest 的\0)顶多追加 n 个字节参数 dest 指向用来保存字符串的内存空间src 指向要追加的字符串n 最多追加 n 个字节返回值 成功返回追加后字符串的首地址其实就是 dest 所指向的字符串失败则返回NULL代码实现其运行结果为注意 strncat到底追加多少个字节(1) 在追加完 n 个字节前遇到\0追加结束(\0也会被追加)后面的就不管了。(2) 在追加完 n 个字节前没遇到\0但是已经追加了 n 个字节了结束追加。(同时自动补一个\0)5) strcmp() / strncmp() 比较字符串 无BUGstrcmp()函数原型 int strcmp(const char *s1, const char *s2);头文件 #include string.h功能 用来比较 s1 和 s2 两个字符串参数 s1 表示要进行比较的字符串1 的首地址s2 表示要进行比较的字符串2 的首地址返回值 如果 s1 大于 s2则返回一个正数如果 s1 等于 s2则返回一个0如果 s1 小于 s2则返回一个负数字符串的比较规则逐个字符依次进行比较比较每个字符的ASCII码如果两个字符串的第一个字符相同则再比较两个字符串中的第二个字符如果第二个也相同则再比较第三个依次类推。直到两个字符串的对应位置的字符不相同或者其中一个字符串遍历完成那么就返回这两个不相同字符的ASCII码的差值。代码实现其运行结果为strncmp()函数原型 int strncmp(const char *s1, const char *s2, size_t n);头文件 #include string.h功能 用来比较 s1 和 s2 两个字符串只不过只比较前面 n 个字节参数 s1 表示要进行比较的字符串1 的首地址s2 表示要进行比较的字符串2 的首地址n 表示只比较前面 n 个字节返回值 如果 s1 大于 s2则返回一个正数如果 s1 等于 s2则返回一个0如果 s1 小于 s2则返回一个负数代码实现其运行结果为