標籤:
在網上看到這道題,編寫程式如下:
代碼1:
char *cpystr(char *des,const char *src)
{
int i = 0;
if (NULL == des || NULL == src)
return NULL;
while (src[i] != ‘\0‘)
{
des[i] = src[i];
i++;
}
return des;
}
1.這樣寫可以實現複製功能,只是C/C++文法有一個漏洞,支援const char*向char *的預設轉換,如果調用
cpystr()時這樣寫:cpystr("hello","hello");可以編譯通過(在VS2013下測試)。運行會發生段錯誤。
為避免這個錯誤,可以定義一個函數如下:、
char *cpystr(const char *des,const char *src)
{
printf("error:the first arg can‘t be const\n");
exit(0);
}
如果知識聲明char *cpystr(const char *des,const char *src);而不對該函數進行定義,會發生錯誤,
“ error LNK2019: 無法解析的外部符號 "char * __cdecl cpystr(char const *,char const *)" ([email protected]@[email protected]),
該符號在函數 _main 中被引用。”
2.上面說的,給cpystr(char *des,const char *src)傳參cpystr("hello","hello"),會將第一個參數的第一個參數const char *轉換為
char *,編譯可以通過。需要利用函數重載另定義一個函數cpystr(const char *des,const char *src)來解決。
代碼2:
const char *a = "hello";
char *b = a;
代碼2在VS2013下不能編譯通過,顯示error C2440: “初始化”: 無法從“const char *”轉換為“char *”
3.上面的代碼1和代碼2寫成C語言編譯的結果和C++編譯的結果是一樣的(用gcc做的測試),可惜C語言無法進行函數重載來避免這個錯誤。
編寫C++程式,實現strcpy()功能