由strcat原始碼重新考慮 0 的問題

2021-07-02 21:03:00 字數 2438 閱讀 7337

strcat函式在c中string.h的標頭檔案中,是連線字串的函式,看看原始碼

char *strcat(char *strdest, const

char *strscr)

//將源字串加const,表明其為輸入引數

while(*strdest++ = *strscr++)

//此處可以加語句*strdest=』/0』;有無必要?

return address; //為了實現鏈式操作,將目的位址返回

}

assert函式的原始碼也給出吧,以後有時間分析

/* allow this file to be included multiple times

with different settings of ndebug. */

//assert 為c庫提供的一種斷言機制

//斷言用來在標準錯誤輸出流輸出資訊,並且使程式異常終止

/* 斷言的機制:

*///首先取消 assert 巨集的定義,

//這樣做的目的是為了防止巨集重複被定義

#undef assert

#undef __assert

//通過判斷是否定義巨集 ndebug 來判斷在源**中是否需要巨集assert

/* 如果定義了 ndebug 巨集,就表示不需要在程式中引用 assert 巨集

ndebug: do not debug

否則就在程式中,assert 巨集將被執行

可以發現assert巨集在定義 ndebug時,定義很特別,巨集引數並沒有引用

*/#ifdef ndebug

//定義了ndebug巨集,assert 巨集定義為不做任何提示輸出

#define assert(ignore) ((void)0)

#else

void __eprintf (); /* defined in gnulib */

#ifdef __stdc__ //定義了__stdc__巨集

#define assert(expression) \

((void) ((expression) ? 0 : __assert (#expression, __file__, __line__)))

#define __assert(expression, file, lineno) \

(__eprintf ("failed assertion `%s' at line %d of `%s'.\n", \

expression, lineno, file), 0)

#else /* no __stdc__; i.e. -traditional. */

#define assert(expression) \

((void) ((expression) ? 0 : __assert (expression, __file__, __line__)))

#define __assert(expression, file, lineno) \

(__eprintf ("failed assertion `%s' at line %d of `%s'.\n", \

"expression", lineno, file), 0)

#endif /* no __stdc__; i.e. -traditional. */

#endif

還是研究strcat,基本思想就是首先尋找字串結束符『\0』,然後將要連線的連線起來,自己的實現

#include 

#include

using

namespace

std;

char * my_strcat(char * dst,const

char* src)

*dst='\0';

return head;

}int main()

為了防止野指標,所以需要檢測傳進來的指標是否有效

對比原始碼有下面一句

while(*strdest) //是while(*strdest!=』/0』)的簡化形式

因為一直以為while是在0時退出,而『\0』和 0 是否一致?

做實驗吧

在谷歌中這樣解釋

『\0』是c/c++語言中的字串結束符,在ascii字符集中對應數字0。

果然如此,這是其ascii碼,0的碼是40d,這樣就可以理解了

while(*strdest++ = *strscr++)

這裡沒有在末尾特別加結束符,其實是沒有必要,

這個while的執行順序是,首先scr賦值給dest,然後dest再送給while判定,這就包含了結束符

在除錯中,由於buff沒有初始化,導致裡面亂碼,檢測不到結束符,也許這也是乙個使用trap吧

c語言庫函式strcat原始碼實現

c語言strcat函式 strcat 函式的原型是 char strcat char dest,const char src 把 src 所指向的字串追加到 dest 所指向的字串的結尾。該函式返回乙個指向最終的目標字串 dest 的指標。使用之前應包含標頭檔案 include strcat函式經典...

由原始碼理解spring初始化過程

0.1.org.springframework.web.context.contextloaderlistener類進行容器的初始化時,該類會被web容器 如tomcat 自動例項化,並呼叫contextinitialized方法。public void contextinitialized ser...

vscode原始碼編譯執行打包使其由英文變為中文

最近發現乙個很奇怪的問題,vscode打包前和打包後存在很大的不同的,正常來說,比如我們開發專案,實際上來說,本地怎麼樣,線上就怎麼樣,當然了,也不排除一些線上導致的bug。比如vscode原始碼已經啟用了中文語言包外掛程式,同時也修改了locale.json檔案 將檔案中的en改為zh cn 但是...