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 但是...