程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C標准庫字符串函數:strncpy

C標准庫字符串函數:strncpy

編輯:關於C語言
 

不使用庫函數實現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;
}
 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved