- strcpy字符串拷贝/调换
- 1利用数组实现
- 2指针实现
- 内置字符串拷贝函数strcpy
- 内置字符串拷贝函数strcpy_s
strcpy字符串拷贝/调换
将src(源)地址中的内容拷贝到des(目标)地址。
1利用数组实现#include2指针实现#include //while循环 void Mystrcpy(char* des, char* src)//字符串调换 { assert(des != NULL && src != NULL);//断言,需要头文件#include int i = 0; while (src[i] != '') { des[i] = src[i]; i++; } des[i] = ''; } //for循环 void Mystrcpy(char* des, const char* src)//当做数组使用,字符数组 { assert(des != NULL && src != NULL); int i = 0; for (; src[i] != ''; i++) { des[i] = src[i]; //src[i] = 'a';//src[i] == *(src+i)不允许出现在左值(具有const限定符,不能修改其值) } des[i] = ''; } int main() { char frr[100] = "hello"; char hrr[] = "world"; Mystrcpy(frr, hrr); printf("%sn", frr); return 0; }
#include内置字符串拷贝函数strcpy#include void Mystrcpy_0(char* des, const char* src) { assert(des != NULL && src != NULL); for (; *src != ''; des++, src++) { *des = *src; } *des = ''; } void Mystrcpy_1(char* des, const char* src) { assert(des != NULL && src != NULL); while (*src != '') { *des++ = *src++;//*和++都属于二级,且自右向左,因此先进行des++,src++ } //属于后置++,先进行赋值解引用,然后++ *des = ''; } void Mystrcpy_2(char* des, const char* src) { assert(des != NULL && src != NULL); while (*des++ = *src++);//当des赋值为‘’时,判断为假,循环结束 } char* Mystrcpy_3(char* des, const char* src) { assert(des != NULL && src != NULL); char* p = des; while (*des++ = *src++); return p; } int main() { char irr[] = "hello"; char jrr[] = "world"; char* str1 = irr; //char str2[10]; char* str2 = jrr; //Mystrcpy_2(str2, str1);//无返回值 //printf("%sn", str2); printf("%sn", Mystrcpy_3(str2, str1));//有返回值 return 0; }
- char* strcpy(char* des, const char* src)
- 具有返回值即字符串的首地址,支持字符串的链式表达
- 需要头文件 #include
- VS2019不能够直接使用,可以在开头添加取消错误提醒的声明 #define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS #include#include int main() { char* str1 = "hello"; char* str2 = "world"; printf("%sn", strcpy(str2, str1)); return 0; }
char* str1 = “hello”;
不适用于VS2019,其中“const char * ”类型的值不能用于初始化 “char * “ 类型的实体
1、先声明使用字符数组,定义指针
2、直接强转
3、使用const修饰,在内置字符串拷贝函数strcpy时,const只能修饰src(源)
#define _CRT_SECURE_NO_WARNINGS #include内置字符串拷贝函数strcpy_s#include int main() { char* str1 = "hello"; char* str2 = "world"; char irr[] = "abcde";//声明字符数组 char* str1 = irr; char* str2 = (char*)"abcde"//强转 //const char* str2 = "abcde"//const修饰 printf("%sn", strcpy(str2, str1)); return 0; }
- errno_t strcpy_s(char* des, size_t numberOfElements, const char* src)
- 将src(源)地址中的内容拷贝到des(目标)地址。
- numberOfElements为缓冲区的大小,其大于等于src+’’,且小于等于des
- 返回值类型errno_t,用于判断是否复制成功。
- des必须大于或等于src+’’的大小
#include#include int main() { char irr[] = "hello"; char jrr[10] = "world"; char* str1 = irr; char* str2 = jrr; strcpy_s(str2, strlen(str1) + 1, str1); strcpy_s(str2, strlen(str2)+2, str1);//都可以 strcpy_s(str2, sizeof(irr), str1); printf("%sn", strcpy(str2, str1)); return 0; }
注:
sizeof是求数组实际大小,包含’’
strlen是求数组有效元素的个数,不包含’’
此处sizeof是求数组irr实际大小,而不是指针str1的大小。
sizeof(str1)只是求指针的大小为4个字节。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)