C語(yǔ)言的strcpy函數(shù)你了解嗎
strcpy
拷貝字符串到目標(biāo)地址

函數(shù)原型
char *strcpy( char * destination, const char * source )
參數(shù)講解
| 參數(shù) | destination | source |
| 解釋 | 目標(biāo)字符串地址 | 以 Null 結(jié)尾的源字符串地址 |
返回值詳解
這些函數(shù)中的每一個(gè)都返回目標(biāo)字符串,沒(méi)有返回值就是拷貝失敗。
函數(shù)詳解
strcpy使用時(shí)幾個(gè)注意點(diǎn)
第一個(gè)注意點(diǎn):源字符串必須以‘\0’結(jié)束,同時(shí)會(huì)將源字符串中的‘\0’拷貝到目標(biāo)空間。
就是說(shuō)當(dāng)我們把源字符串拷貝到目標(biāo)地址時(shí)什么時(shí)候停止呢,就是當(dāng)把源字符串中的‘\0’也拷貝過(guò)去時(shí)結(jié)束。
用以下代碼為例,就是說(shuō)當(dāng)arr2中f拷貝到arr1中時(shí),strcpy還會(huì)把a(bǔ)rr2中的‘\0’拷貝到arr1中
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[8];
char arr2[] = "abcdef";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
而如果arr2中沒(méi)有‘\0’時(shí),看如下圖片所示,strcpy會(huì)越界訪問(wèn)直到程序崩潰!
而當(dāng)給arr2中添加'\0'時(shí),程序就很容易就編譯過(guò)去了

所以在源地址中一定要存在'\0'
第二個(gè)注意點(diǎn):目標(biāo)空間必須足夠大,以確保能存放源字符串
假如我們把a(bǔ)rr2中的七個(gè)字符拷貝到arr1中去,遺憾的是arr1只有四個(gè)空間不夠大,這時(shí)我們還調(diào)用strcpy,就會(huì)發(fā)現(xiàn)程序崩了!

為什么程序會(huì)崩了呢?原因很簡(jiǎn)單,就是‘裝不下’,arr1的棧空間被破壞了。
而作為程序員的我們,必須保證目標(biāo)空間足夠大,strcpy本身是不考慮這些問(wèn)題的(很滑稽是不是,有一種你叫我干啥我干啥,出事了還怪我嘍的味道)
第三個(gè)注意點(diǎn):目標(biāo)空間必須可變
例如下面這個(gè)代碼,arr1指向"qwertyuiop"(這個(gè)字符串足夠長(zhǎng)吧),現(xiàn)在要求把a(bǔ)rr2中的字符串拷貝到arr1中去,大家覺(jué)得結(jié)果會(huì)是什么?
#include<stdio.h>
#include<string.h>
int main()
{
char* arr1 = "qwertyuiop";
char arr2[] = "abcedf";
strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}看到這想必大家心理應(yīng)該都有答案了,調(diào)試一下發(fā)現(xiàn)程序又崩了!這是為什么呢?
就是因?yàn)閍rr1指向的是常量字符串,常量是不可修改的。如果非要寫(xiě)成代碼去修改它,抱歉只能報(bào)錯(cuò)了。所以大家使用strcpy是目的地必須是可修改的。

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- 詳解C語(yǔ)言中strcpy()函數(shù)與strncpy()函數(shù)的使用
- C語(yǔ)言中的strdup()函數(shù)和其與strcpy()函數(shù)的區(qū)別
- C語(yǔ)言中字符串常用函數(shù)strcat與strcpy的用法介紹
- C語(yǔ)言 strcpy和memcpy區(qū)別詳細(xì)介紹
- C語(yǔ)言不使用strcpy函數(shù)如何實(shí)現(xiàn)字符串復(fù)制功能
- 徹底掌握C語(yǔ)言strcpy函數(shù)的用法
- 詳解c語(yǔ)言中的 strcpy和strncpy字符串函數(shù)使用
- C語(yǔ)言strcpy庫(kù)函數(shù)詳解
- C語(yǔ)言中strcpy()函數(shù)的具體實(shí)現(xiàn)及注意事項(xiàng)
- C語(yǔ)言庫(kù)函數(shù)strcpy的使用及模擬實(shí)現(xiàn)
相關(guān)文章
C++類(lèi)與對(duì)象的基礎(chǔ)知識(shí)點(diǎn)詳細(xì)分析
類(lèi)和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱(chēng)。對(duì)象是對(duì)客觀事物的抽象,類(lèi)是對(duì)對(duì)象的抽象。類(lèi)是一種抽象的數(shù)據(jù)類(lèi)型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域2023-02-02
C++ 數(shù)字的反轉(zhuǎn)實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了C++ 數(shù)字的反轉(zhuǎn)實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
c++獲取sqlite3數(shù)據(jù)庫(kù)表中所有字段的方法小結(jié)
本文給大家分享c++獲取sqlite3數(shù)據(jù)庫(kù)表中所有字段的三種常用方法,本文針對(duì)每一種方法給大家詳細(xì)介紹,需要的的朋友通過(guò)本文一起學(xué)習(xí)吧2016-11-11
C/C++通過(guò)SQLite SDK實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查操作
SQLite,作為一款嵌入式關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),一直以其輕量級(jí)、零配置以及跨平臺(tái)等特性而備受青睞,本文主要介紹了C++如何通過(guò)SQLite SDK實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查操作,感興趣的可以了解下2023-11-11

