1、函數原型。
#include <stdio.h>
char *strncpy(char *s1, const char *s2, size_t n) //函數的傳回值為指針,形參為兩個指針(字元串數組,相當于指向第一個字元的指針)和n(指派字元個數)。
{
char *tmp = s1; //将指針tmp聲明為指針s1,指向字元串第一個字元的指針,
while(n)
{
if(!(*s1++ = *s2++)) // 将str2的元素依次指派給str1,當str2小于n時,一直指派到最後的null字元終止,當str2大于n時,複制n個元素。
break; // 當str2的長度小于n時,此循環判斷條件起作用
n--; // 當n小于字元串str2的長度時,此時循環判斷條件起作用
}
while(n--) // 當str2小于n時,遞減後n扔為正數,将字元串數組s1後依次複制n-str2長度個'\0'。
*s1++ = '\0';
return tmp; // 函數傳回指針,指向字元串str1第一個字元的指針。
}
int main(void)
{
char str1[128] = "abcdefg";
char str2[128] = "123456789";
size_t n;
printf("n = "); scanf("%u", &n);
printf("copy result: %s\n", strncpy(str1, str2, n)); // 函數實參為字元串數組的名稱(相當于指向第一個元素的指針)和複制的字元個數n。
return 0;
}

↓
函數原型修改
#include <stdio.h>
char *strncpy(char *s1, const char *s2, size_t n) //函數的傳回值為指針,形參為兩個指針(字元串數組,相當于指向第一個字元的指針)和n(指派字元個數)。
{
char *tmp = s1; //将指針tmp聲明為指針s1,指向字元串第一個字元的指針,
while(n)
{
if(!(*s1++ = *s2++)) // 将str2的元素依次指派給str1,當str2小于n時,一直指派到最後的null字元終止,當str2大于n時,複制n個元素。
break; // 當str2的長度小于n時,此循環判斷條件起作用
n--; // 當n小于字元串str2的長度時,此時循環判斷條件起作用
}
while(n--) // 當str2小于n時,遞減後n扔為正數,将字元串數組s1後依次複制n-str2長度個'\0'。
*s1++ = '\0';
*s1 = '\0'; //可以實作僅保留複制的部分
return tmp; // 函數傳回指針,指向字元串str1第一個字元的指針。
}
int main(void)
{
char str1[128] = "abcdefg";
char str2[128] = "123456789";
size_t n;
printf("n = "); scanf("%u", &n);
printf("copy result: %s\n", strncpy(str1, str2, n)); // 函數實參為字元串數組的名稱(相當于指向第一個元素的指針)和複制的字元個數n。
return 0;
}
#include <stdio.h>
#include <string.h> // strncpy的頭檔案
int main(void)
{
char str1[128] = "abcdefg";
char str2[128] = "123456789";
size_t n;
printf("n = "); scanf("%u", &n);
printf("copy result: %s\n", strncpy(str1, str2, n)); //函數實參為兩個字元串數組(相當于指向數組第一個元素的指針,函數間數組的傳遞是以指向第一個元素的指針進行的)和
//複制的元素個數n。
return 0;
}