strncpy函式自建和while 與指標等問題

2021-07-12 07:22:34 字數 1928 閱讀 8845

問題描述:

strncpy(s1,s2,n)函式從s2複製n個字元給s1,並在必要時截斷s2或為其填充額外的空字元。如果

s2的長度等於或者大於n,目標字串就沒有標誌結束的空字元。函式返回s1。自己編寫這個函式,並在

乙個使用迴圈語句為這個函式提供輸入的完整程式中進行測試。

分析:strncpy函式是string.h中所包含的函式,此問題讓你自己編寫這個函式(c primer puls 十一章的程式設計題)。

此函式的返回值是char指標,實際引數是被查詢的char陣列str1,查詢目前的str2,以及n。並且實互動。

源**:

#include

char *mystrncpy(char *p1, char *p2, int n);

int main(void)

while(*str1 != 'q');

puts("quit.");

return 0;

}char *mystrncpy(char *p1, char *p2, int n)

return p;

}輸入與輸出結果:

input string1:

abcde

input string2:

fgh

input the number of copying char:

5

after copying:

abcdefgh

input any char except q to go on.

q

quit.

press any key to continue

上面是給出的源**,對於紅色的**,我想了半天都沒有理解意思。我的理解是:

執行完while(*p1++ != '\0') continue; 之後,指標p1應該指向的是e後面的空字元'\0',那麼 *--p1 = *p2; n--;

又是什麼意思呢?出問題了啊。

那麼我的思想肯定是不對的,應該希望是e後面的空字元'\0',去掉,並且空字元位置變為f才對。

那麼就是對於while(*p1++ != '\0') continue; 的理解出現了問題。到底最後p1指向的是e後面的空字元嗎?

做了以下的 測試:

#include

char *mystrncpy(char *p1, char *p2, int n);

int main(void)

char *mystrncpy(char *p1, char *p2, int n)    //重點在這裡

printf("%p\n",p1);

*--p1 = *p2;

n--;

while(n>0 && *p2 != '\0')

return p;

}input string1:

abcde

input string2:

fg

input the number of copying char:

5

after copying:

0019feec

0019feed

0019feee

0019feef

0019fef0

0019fef1

0019fef2

abcdefg

press any key to continue

開始時p1指向首位址及a,整體while之後,p1指向的是e後面空字元的後面的位置。

所以可見while(*p1++ != '\0')的意思,取完位址判斷後,即使不符合條件,++也會進行。

模板 strncpy函式

strncpy是 c語言的函式之一,來自 c語言標準庫,定義於 string.h,char strncpy char destin,char source,int maxlen 把src所指由null結束的字串的前n個位元組複製到dest所指的陣列中。1 2 3 標頭檔案 include char ...

strncpy函式使用

dest 表示複製的目標字元陣列 src 表示複製的源字元陣列 n 表示複製的字串長度。char mystr null uint8 i 0 uint32 cnt 0 uint8 sub 16 mystr strstr pbuffer,data cnt strlen mystr strncpy sub...

Strcpy函式和Strncpy函式

strcpy函式原型char strcpy char strdestination,const char strsource 庫函式下的strcpy include include intmain char arr2 abcdef strcpy arr1,arr2 printf s arr1 ret...