不使用庫函數實現strncpy。
#if VERSION1
char *strncpy(char *dst, const char *src, size_t count)
{
assert((dst != NULL) && (src != NULL));
char *tmp = dst;
while (count-- && (*dst++ = *src++) != '\0') {
/* nothing */;
}
return tmp;
}
#endif
#if STD_VERSION
char *strncpy(char *dst, const char *src, size_t count)
{
assert((dst != NULL) && (src != NULL));
char *tmp = dst;
while (count && (*dst++ = *src++) != '\0') {
count--;
}
while (count--) {
*dst++ = '\0';
}
return tmp;
}
#endif
這裡實現了兩個版本,實際上都有使用上的不便處。
版本1中,如果源串長度大於等於目的串,則復制完指定count字節後停止,不會自動添加'\0'。這時需要程序員保證count不能大於dst的長度,否則就會發生內存越界。如果源串小於目的串,則在復制完成源串後,自動結束。
版本2中,如果源串長度大於等於目的串,則復制完指定count字節後停止,不會自動添加'\0'。這時需要程序員保證count不能大於dst的長度,否則就會發生內存越界。如果源串小於目的串,則在復制完成源串後,還會繼續復制'\0'到dst,直到達到count的字節數。
ANSI C標准庫的規定中還是版本2。在使用時需要注意這些細節問題。
//***************** 補充基本功 ****************
//如果不是引用,形參只是實參的副本,指針也不例外!
#include<stdio.h>
void test(char *p) //這個p只是a的副本,只是他們指向同一塊內存
{
p++;
}
int main()
{
char *a="123456";
test(a);
puts(a);
a++;
puts(a);
return 0;
}