問題描述:
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...