strcpy函数
一. strcpy函数的简介
下面是库中的strcpy()函数声明:
char* strcpy(char* destination,const char* source);
strcpy的功能是将一个字符串复制到另一块空间地址中 的函数,‘\0’是停止拷贝的终止条件,同时也会将 ‘\0’ 也复制到目标空间。
1. 函数的参数:
char* destination
---------目标字符串的首地址
const char* source
------源地址:被复制的字符串的首地址,用const修饰,避免修改掉被拷贝的字符串
2.函数的返回值类型:
char*
:返回的是目标字符串的首地址
二、strcpy函数的使用
#include <stdio.h> #include <string.h> int main() { char arr[10] = "########"; char err[10] = "hello"; strcpy(arr, err); printf("%s\n", arr); return 0; }
三、strcpy函数的注意事项
1.源字符必须以 '\0’结束:
#include <stdio.h> #include <string.h> int main() { char arr[10] = "##########"; char err[] = { 'a','b','c','d' }; printf("%s\n", strcpy(arr, err)); return 0; }
程序报错,运行异常。因为,我们知道‘\0’是strcpy函数停止拷贝的终止条件。err字符数组所在的内存空间后面存储的内容并不知道,不遇到 ‘\0’ 拷贝就不会停止,这就会导致越界访问,程序就会出现问题。
2.目标空间必须足够大,以确保能放源字符串
#include <stdio.h> #include <string.h> int main() { char arr[5] = "###"; char err[] = "hello world"; strcpy(arr, err); printf("%s\n", arr); return 0; }
运行结果
这里虽然拷贝成功并将结果输出了,但程序却崩溃了。目标空间太小,不足以放置拷贝的源字符串,会造成溢出的情况。
3.目标空间必须可变
int main() { char* p = "hello world"; char arr[10] = "*********"; printf("%s\n", strcpy(p, arr)); return 0; }
程序错误,无法复制。这是因为由char* strcpy(char* destination,const char* source);可知,也就是说它要复制的那块空间必须是可以变化的。但是,在这里p是一个指针,它指向了一个常量空间,常量空间是无法改变的。所以,程序错误。
四、strcpy函数的模拟
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <assert.h> char* my_strcpy(char* arr, const char* err) { assert(arr!=NULL); assert(err !=NULL char* start = arr;//保存arr的数组首地址,便于return //下面的部分可以写成 // while(*arr++ = *err++){} // while (*err != '\0')//遍历err数组 { *arr = *err;//解引用,将对应的元素拷贝 arr++;//arr数组+1 err++;//err数组+1 } *arr = *err;//while循环到'\0'就结束了,所以还需要将\0赋值过去。 return start; } int main() { char arr[10] = "*********"; char err[5] = "lili"; printf("%s", my_strcpy(arr, err)); return 0; }
运行结果
strncpy函数
一、strncpy函数的简介
1.下面是库中的strcpy()函数声明:
char *strncpy(char *dest, const char *src, int n)
n:要拷贝的个数,即:将src中前n个字符赋值到dest中。
2.使用细节
1、当src字符串长度小于n时,则拷贝完字符串后,剩余部分将用空字节填充,直到n个
2. strncpy不会向dest追加’\0’。
二 、区别
与strcpy的区别
1、strcpy() 函数用来复制字符串;strncpy()用来复制字符串的前n个字符,所以要多传一个参数n
1)char *strcpy(char *dest, const char *src);
2)char * strncpy(char *dest, const char *src,size_t n
);
2、不像strcpy(),strncpy()不会向dest追加结束标记’\0’
三、strcnpy模拟
#include <stdio.h> #include<string.h> #include <assert.h> //dest为目标数组,src为源数组,n为要复制的字符个数 char* My_strncpy(char* dest, const char* src, int n) { assert(dest != NULL);//保证dest非空 assert(src != NULL); //保证src非空 char* ret = dest; //将dest首地址储存在ret中,在之后dest++运算中,可以方便找到 while (n) //一次复制一个字符,要复制n次 { *dest = *src; //复制 src++; //源地址往后+1 dest++; //目标地址往后+1 n--; //跳出循环条件 } return ret; //返回目的数组的首地址 } int main() { char arr1[] = "I LOVE YOU"; char arr2[] = "SORRY"; My_strncpy(arr1, arr2,5); //经过函数My_strncpy后 ,arr1里应该是字符串 SORRYE YOU printf("arr1: %s\n", arr1); return 0; }