C語言中strcpy()函數(shù)的具體實(shí)現(xiàn)及注意事項(xiàng)
一、strcpy()函數(shù)的簡介
strcpy()函數(shù):是將一個(gè)字符串復(fù)制到另一塊空間地址中 的函數(shù),‘\0’是停止拷貝的終止條件,同時(shí)也會(huì)將 '\0' 也復(fù)制到目標(biāo)空間。下面是庫中的strcpy()函數(shù)聲明:
char* strcpy(char* destination,const char* source);
1. 函數(shù)的參數(shù):
- char* destination---------目標(biāo)字符串的首地址
- const char* source------源地址:被復(fù)制的字符串的首地址,用const修飾,避免修改掉被拷貝的字符串
2.函數(shù)的返回值類型:
- char*:返回的是目標(biāo)字符串的首地址
二、strcpy()函數(shù)的具體使用
場景一:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr[10] = "########";
printf("%s\n", strcpy(arr,"hello"));
return 0;
}輸出的結(jié)果

場景二:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[10] = "**********";
char arr2[10] = "abcd";
printf("%s\n", strcpy(arr1, arr2));
return 0;
}輸出結(jié)果

三、使用strcpy()函數(shù)的注意事項(xiàng)
1.源字符必須以 '\0'結(jié)束:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[10] = "**********";
char arr2[] = { 'a','b','c','d' };
printf("%s\n", strcpy(arr1,arr2));
return 0;
}這里的代碼會(huì)出錯(cuò),'\0'是停止拷貝的終止條件,arr2字符數(shù)組所在的內(nèi)存空間后面存儲(chǔ)的內(nèi)容并不知道,不遇到 '\0' 拷貝就不會(huì)停止,這就會(huì)導(dǎo)致越界訪問,程序就會(huì)出現(xiàn)問題。
2.目標(biāo)空間必須足夠大,以確保能放源字符串
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[5] = "*****";
char arr2[] = "hello world";
printf("%s\n", strcpy(arr1,arr2));
return 0;
}這里雖然拷貝成功并將結(jié)果輸出了,但程序卻崩潰了。目標(biāo)空間太小,不足以放置拷貝的源字符串,會(huì)造成溢出的情況
3.目標(biāo)空間必須可變
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char* str1 = "hello world";
char str2[10] = "*********";
printf("%s\n", strcpy(str1,str2));
return 0;
}這里的程序也出現(xiàn)了錯(cuò)誤。str1指向的是常量字符串,是不可以被修改掉的,目標(biāo)空間必須是可以被修改的,因?yàn)橐獙⒖截惖淖址旁谀繕?biāo)空間中。而源字符串可以是能夠修改的、也可以是不能修改的,因?yàn)閟trcpy函數(shù)的第二個(gè)參數(shù)已經(jīng)用const關(guān)鍵字修飾了,保證了拷貝過程中不會(huì)被修改。
補(bǔ)充:strcpy()的其它屬性
strcpy()的返回類型是char *,該函數(shù)返回的是一個(gè)字符的地址。
第一個(gè)參數(shù)不必指向數(shù)組的開始,這個(gè)特性可用于拷貝數(shù)組的一部分。
下面這個(gè)程序演示了將一個(gè)字符串拷貝到另一個(gè)字符數(shù)組的指定位置:
/*
* @Author: Your name
* @Date: 2020-02-24 14:35:13
* @Last Modified by: Your name
* @Last Modified time: 2020-02-24 15:26:57
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define WORDS "beast"
#define SIZE 40
int main()
{
const char * orig = WORDS;
char copy[SIZE] = "Be the best that you can be.";
char * ps;
puts(orig);
puts(copy);
ps = strcpy(copy+7,orig);//ps==©[7],第八個(gè)元素的地址。
puts(copy);
puts(ps);
getchar();
return 0;
}下面是該程序的輸出:
beast
Be the best that you can be.
Be the beast
beast
注意:
- strcpy()把源字符的空字符也拷貝進(jìn)去
- 所以空字符覆蓋了copy數(shù)組中that的第一個(gè)t
- 由于第一個(gè)參數(shù)是copy+7,所以ps指向copy中的第8個(gè)元素,因此puts(ps)從該處開始打印
具體如下:

總結(jié)
到此這篇關(guān)于C語言中strcpy()函數(shù)的具體實(shí)現(xiàn)及注意事項(xiàng)的文章就介紹到這了,更多相關(guān)C語言strcpy()函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解C語言中strcpy()函數(shù)與strncpy()函數(shù)的使用
- C語言中的strdup()函數(shù)和其與strcpy()函數(shù)的區(qū)別
- C語言中字符串常用函數(shù)strcat與strcpy的用法介紹
- C語言 strcpy和memcpy區(qū)別詳細(xì)介紹
- C語言不使用strcpy函數(shù)如何實(shí)現(xiàn)字符串復(fù)制功能
- 徹底掌握C語言strcpy函數(shù)的用法
- 詳解c語言中的 strcpy和strncpy字符串函數(shù)使用
- C語言的strcpy函數(shù)你了解嗎
- C語言strcpy庫函數(shù)詳解
- C語言庫函數(shù)strcpy的使用及模擬實(shí)現(xiàn)
相關(guān)文章
C語言控制臺(tái)繪制曲線的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了C語言控制臺(tái)繪制曲線的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
C++中對(duì)象的動(dòng)態(tài)建立與釋放詳解及其作用介紹
這篇文章主要介紹了C++中對(duì)象的動(dòng)態(tài)建立與釋放詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Qt編寫自定義控件實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤
這篇文章主要為大家詳細(xì)介紹了Qt編寫自定義控件實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
C語言中指針 int *p=0;和int *p;*p=0;和”&“的關(guān)系和區(qū)別詳解
這篇文章主要介紹了C語言中指針 int *p=0;和int *p;*p=0;和”&“有什么關(guān)系和區(qū)別,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
c++中l(wèi)og4cplus日志庫使用的基本步驟和示例代碼
這篇文章主要給大家介紹了關(guān)于c++中l(wèi)og4cplus日志庫使用的相關(guān)資料,log4cplus是一款開源的c++日志庫,具有線程安全,靈活,以及多粒度控制的特點(diǎn),log4cplus可以將日志按照優(yōu)先級(jí)進(jìn)行劃分,使其可以面向程序的調(diào)試,運(yùn)行,測試,后期維護(hù)等軟件全生命周期,需要的朋友可以參考下2024-06-06

