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; }
2、加載strncpy的頭文件,可以直接調用strncpy函數
#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; }