1.?
創(chuàng)新互聯(lián)建站是一家從事企業(yè)網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)站建設(shè)、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)制作的專業(yè)的建站公司,擁有經(jīng)驗(yàn)豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁設(shè)計(jì)人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實(shí)力,在網(wǎng)站建設(shè)領(lǐng)域樹立了自己獨(dú)特的設(shè)計(jì)風(fēng)格。自公司成立以來曾獨(dú)立設(shè)計(jì)制作的站點(diǎn)超過千家。2.?
strerror()?1. C語言的庫(kù)函數(shù)在運(yùn)行的時(shí)候,如果發(fā)生錯(cuò)誤,就會(huì)將錯(cuò)誤碼存在一個(gè)變量里面。這個(gè)變量就是:errno(全局變量)。?
2.? 這個(gè)函數(shù)的功能在于把錯(cuò)誤碼轉(zhuǎn)化為對(duì)應(yīng)的錯(cuò)誤信息,錯(cuò)誤信息說白了就是一個(gè)字符串,它返回錯(cuò)誤信息所對(duì)應(yīng)的地址(并不是直接打印出來),?這個(gè)函數(shù)其實(shí)就是你給我傳一個(gè)數(shù)字,我把這個(gè)數(shù)字對(duì)應(yīng)的錯(cuò)誤信息的起始地址給你返回來。
正是因?yàn)殡娔X庫(kù)函數(shù)運(yùn)行一旦發(fā)生錯(cuò)誤,計(jì)算機(jī)就會(huì)主動(dòng)把錯(cuò)誤碼放到errno這個(gè)全局變量里面去,因此strerror的參數(shù)往往就是errno
3. 錯(cuò)誤碼是一些數(shù)字,比方說1.2.3.4.....我們需要將錯(cuò)誤碼翻譯成錯(cuò)誤信息,其實(shí)每一個(gè)這樣的錯(cuò)誤碼都對(duì)應(yīng)著一個(gè)錯(cuò)誤信息
4.??這個(gè)函數(shù)其實(shí)就是你給我傳一個(gè)數(shù)字,我把這個(gè)數(shù)字對(duì)應(yīng)的錯(cuò)誤信息的起始地址給你返回來。
5.?因?yàn)殄e(cuò)誤信息本質(zhì)上也是一個(gè)字符串,所以這個(gè)函數(shù)就是把錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息(其實(shí)也是一個(gè)字符串)首字符的地址給你返回來,所以printf%s直接可以打印出來
6.?實(shí)際上當(dāng)C語言的庫(kù)函數(shù)運(yùn)行出錯(cuò)誤的時(shí)候,我們會(huì)把錯(cuò)誤碼放到errno這樣一個(gè)全局變量里面去,然后你去看這個(gè)變量里面的錯(cuò)誤碼,在翻譯成錯(cuò)誤信息。
7.?比方說要打開一個(gè)文件,打開文件在C語言里面用一函數(shù)fopen()。我要用這個(gè)函數(shù)的話,首先得提供一個(gè)文件名,在提供一個(gè)打開方式。這個(gè)函數(shù)會(huì)返回一個(gè)FILE*類型的指針,這個(gè)函數(shù)如果打開文件成功,就會(huì)返回一個(gè)有效非空指針;如果打開失敗,返回NULL空指針。當(dāng)我打開文件失敗的時(shí)候,就很懵逼,到底是什么原因呢?怎么辦呢?我就不打印什么“打開文件失敗”,我直接用printf%s加上strerror(errno)打印錯(cuò)誤信息
8.?用strerror要引用string.h,用errno要用errno.h
9. 你使用errno的前提是前面調(diào)用那個(gè)函數(shù)失敗了,它把錯(cuò)誤碼放進(jìn)全局變量errno里面去了,這時(shí)候你把錯(cuò)誤碼用strerror轉(zhuǎn)化成錯(cuò)誤信息可以看到?
perror()?1. 還有一個(gè)函數(shù)perror,它其實(shí)是打印錯(cuò)誤信息, 是更加直接直接打印錯(cuò)誤信息。在打印錯(cuò)誤信息之前,你可以自己先傳一些自定義信息,它會(huì)先打印你給它的信息。
2. perror自己肯定會(huì)去捕獲errno里面的錯(cuò)誤碼,然后自己轉(zhuǎn)化為錯(cuò)誤信息,直接給你打印出來,當(dāng)然還可以加上你給的前綴。
3.?perror = printf + strerror。
4. 它主動(dòng)會(huì)去找錯(cuò)誤信息。但它不管三七二十一直接打印錯(cuò)誤信息,但如果我只是為了把錯(cuò)誤碼轉(zhuǎn)化為錯(cuò)誤信息,想獲得錯(cuò)誤信息的字符串,并不想打印,那么我還得回歸到strerror去得到錯(cuò)誤信息字符串首地址。?
5.?
字符分類函數(shù)?1. 之前這些都是與字符串相關(guān)的函數(shù),而我們現(xiàn)在這些是與字符相關(guān)的?
2.?這些is...字符分類函數(shù)的設(shè)計(jì)全都是一樣的,如果是,返回一個(gè)非0數(shù)字,不是的話就返回0。?
參考:
3. 都是需要引用頭文件的? ? ctype.h?
字符轉(zhuǎn)換函數(shù)?1. 還有一種是字符轉(zhuǎn)換函數(shù)tolower()與toupper()。注意在上述這些函數(shù)里面,字符與ACSII碼兩者不用太過于糾結(jié),兩者是很靈活地可以自由根據(jù)情況轉(zhuǎn)化的?
注:這些字符轉(zhuǎn)換函數(shù)與位運(yùn)算一樣,都是沒有副作用的,產(chǎn)生的只是一個(gè)效果,把轉(zhuǎn)換之后的結(jié)果給你返回來。自己并不會(huì)真正改動(dòng)它,而且也做不到,因?yàn)槭侵祩鬟f嘛?例: 將單詞首字母改成大寫的?
#include#includeint main()
{
char arr[20] = { 0 };
gets(arr);
int sz = strlen(arr);
if (islower(*arr))
*arr = toupper(*arr);
int i = 0;
for (i = 1; i< sz - 1; i++)
{
if (islower(*(arr + i)) && *(arr + i - 1) == ' ')
{
*(arr + i) = toupper(*(arr + i));
}
}
printf("%s\n",arr);
}
memcpy()? ?(內(nèi)存數(shù)據(jù)的拷貝)1.?為什么有了字符串的拷貝之后,還需要內(nèi)存的拷貝呢?因?yàn)樽址目截愔会槍?duì)字符串,而我如果想要兩個(gè)整型數(shù)組拷貝則束手無策。?
2.?拷貝其他東西,那么只能通過內(nèi)存拷貝函數(shù)了。?
3.?你會(huì)發(fā)現(xiàn)它的參數(shù)是void*,為啥呢?因?yàn)檫@個(gè)是內(nèi)存拷貝,你內(nèi)存條里的數(shù)據(jù)類型可能是整數(shù)(拷貝整型數(shù)組),可能是結(jié)構(gòu)體(拷貝結(jié)構(gòu)體數(shù)組),可能是浮點(diǎn)數(shù).....為了使得該函數(shù)有良好的兼容性,用瞎子垃圾桶void*可以接受任何類型,也正是因?yàn)槭窍棺觱oid*因?yàn)槲业弥付ǖ谌齻€(gè)參數(shù),你要拷貝幾個(gè)字節(jié)得給我傳過來。?
4.?
1. 拷貝多少個(gè)字節(jié),你要自己去算的。而且你的目標(biāo)指針與源頭指針得自己看好,想怎么搞就怎么搞
2. void*接受完后,這個(gè)參數(shù)指針就是void*了,就是瞎子,但好在你指定了多少個(gè)字節(jié)拷貝數(shù)。
3. 拷貝多少個(gè)字節(jié)不一定要湊好,它不挑剔的,這時(shí)候就需要涉及到大小端字節(jié)序存儲(chǔ)了,自己看著辦。大小端字節(jié)序存儲(chǔ)對(duì)指針解引用與內(nèi)存操作函數(shù)都可能有影響。?
5. 模擬實(shí)現(xiàn)memcpy()
#include
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
注:
1. 參數(shù)是void*,無法解引用,需要強(qiáng)制類型轉(zhuǎn)換。這時(shí)候你思考的緯度是一個(gè)字節(jié)/內(nèi)存單元。而且計(jì)算機(jī)里面也是以字節(jié)為基本單位。強(qiáng)制類型轉(zhuǎn)換為char*這樣子你這個(gè)指針的勢(shì)力范圍與步長(zhǎng)都與基本單位匹配了。
2. 強(qiáng)制類型轉(zhuǎn)換是臨時(shí)的
3. 返回一個(gè)void*指針,回頭你要用自己轉(zhuǎn)換成要想的類型?
1. 這邊主要是涉及到要拷貝的內(nèi)存空間與目標(biāo)內(nèi)存空間重疊的一個(gè)問題,那么這時(shí)候該怎么去拷貝呢
2.? 總原則:源頭指針指向的要拷貝的內(nèi)容不要被覆蓋與破壞3. 模擬實(shí)現(xiàn)memmove()?
#include
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
while (num--)
{
if (src >dest)
{
*((char*)dest) = *((char*)src);
dest = (char*)dest + 1;
src = (char*)src + 1;
}
else
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
附:
memcmp()?1. 如同strcmp()一樣,memcmp也是對(duì)應(yīng)位置一對(duì)字節(jié)一對(duì)字節(jié)依次這么去比較?
2. 一個(gè)字節(jié)其實(shí)里面就是八位二進(jìn)制數(shù),當(dāng)然可以比較了?
3. 再次說明,大小端字節(jié)序存儲(chǔ)對(duì)于指針解引用操作與內(nèi)存操作函數(shù)都是有影響的?
4. 返回類型與strcmp一個(gè)道理?
memset() (內(nèi)存放置函數(shù))1. 其實(shí)就是將內(nèi)存設(shè)置成我們想要的內(nèi)容,是以字節(jié)為基本單位,以字節(jié)為單位來設(shè)置內(nèi)存中的數(shù)據(jù)的。
2. 返回的是參數(shù)指針ptr
3.?
?你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前文章:常用的字符串與內(nèi)存操作函數(shù)(2)-創(chuàng)新互聯(lián)
鏈接地址:http://jinyejixie.com/article24/djedje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、ChatGPT、軟件開發(fā)、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容