char* MyStrcat(char* strDest, const char* strSrc) //知识点1
{
char* d = strDest; //知识点2
while(*strDest) //知识点3
strDest++;
while(*strSrc)
*strDest++ = *strSrc++; //知识点4
*strDest = '\0';
return d;
}
知识点:
- char * :指针函数,返回地址量;注意返回值的内存管理问题,需为全局变量/静态变量/字符串常量/动态内存(堆地址)。
- 最后返回时应为该字符串首地址,故先在程序中保存字符串首地址。
- while(*strDest != '\0') --> while(*strDest) 同义,可简化。
- *strDest++ = *strSrc++ 等价:
*strDest = *strSrc; strDest++; strSrc++;
*与++优先级相同,但由于右运算,*strSrc++等价为*(strSrc++);又因strSrc++自增运算是使用自增之前的值,故整体的运算应为:*strDest=*strSrc; strDest++; strSrc++ 。
-
代码还可简化:
char* MyStrcat(char* strDest, const char* strSrc) { char* d = strDest; while(*strDest++); //注意(1) strDest--; while(*strDest++ = *strSrc++); //注意(2) return d; }
注意:(1)while(*strDest++);先完成括号内的运算,再进行逻辑判断。*strDest++:自增但使用自增前的值解引用;故判断循环结束:当解引用值等于'\0'时,strDest已自增到'\0'的下一位置。故需strDest--,让指针回到'\0'位置。
(2)while(*strDest++ = *strSrc++); 由于是先完成括号内的运算,再进行逻辑判断,所以'\0'已经赋过值了,不用再写。