簡體   English   中英

實現strncpy

[英]Implementation of strncpy

我已經嘗試實現字符串n復制功能。 我已經成功完成了,但是我嘗試優化無法正常工作的代碼。

char *mystrncpy(char *dst, const char *src, size_t n)
{
   int i;
   char *temp;
   temp = dst;  
   for (i = 0; i < n; i++)
      *dst++ = *src++;
   return temp;
}

上面的代碼工作正常。

但是下面的一個有一些問題。 它只是返回我傳遞的任何n值的src字符串。

char *my_strncpy(char *dst, const char*src, size_t n)
{
   char *temp = dst;
   while ((*dst++ = *src++) && (--n));
   return temp;
}

這兩個代碼片段不相同:

  • 第一個遍歷並復制所有n字符,而不管字符串的內容如何;
  • 第二個在復制空終止符后立即停止,或者在復制n字符后(以先到者為准)停止。

第一種和第二種實現均不等同於標准庫中的strncpy ,它會復制到終止符,然后繼續用零填充剩余空間。 為了使您的功能符合標准,請在return語句之前添加以下行:

for (; n-- ; *dst++ = '\0');

需要注意的另一件事是, strncpy背后的意圖經常被誤解:它是在處理固定長度的字符串,而不是固定長度的可變長度字符串。 這就是為什么您需要對從strncpy獲得的結果進行空終止:如果src字符串長於n字符,則結果字符串將不會以空終止。

第二個版本不起作用,因為它可能會超出n 在前面拉n == 0的測試

while (n-- && (*dst++ = *src++))
    ;

並且不要把; 在該行的末尾。 在那里很容易錯過。

您可以在man strncpy看到示例實現

您可以使用此代碼,越簡單越好!

void Strncpy( char* _dst, const char* _src, size_t _n )
{
   size_t i = 0;
   while(i++ != _n && (*_dst++ = *_src++));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM