簡體   English   中英

使用指針在 C 中編寫我自己的 strcopy Function

[英]Writing my own strcopy Function in C using pointers

我正在嘗試在 C 中創建自己的字符串副本 function。 復制文本有效,但是最后在目標字符串中添加了額外的字符,我不知道為什么。 我會很高興得到答復。

這是我的代碼:

#include <stdio.h>
#include <string.h>
 
void copy(char *dst, char *src) {
    int src_len = strlen(src);
    char *src_strtng = &src[0];
    char *dst_strtng = &dst[0];
    for (int i = 0; i < src_len; i++) {
        *dst_strtng++ = *src_strtng++;
    }
    printf("%s\n", dst);
}
 
int main() {
    char srcString[] = "We promptly judged antique ivory buckles for the next prize!";
    char dstString[strlen(srcString)];
    copy(dstString, srcString);
}

在 C 中創建我自己的 str 副本 function。

缺少null 字符終止

這是 OP 的關鍵問題,缺少將null 字符附加到dst

只需要遍歷src一次

而不是strlen()copy()中,只需查找'\0' *1

不返回char *

保存目標指針。

src引用的數據缺少const

迂腐的擔憂: str應該表現得好像charunsigned char *2

char *copy(char* dst, const char* src) {
  unsigned char *udst = (unsigned char *) dst;
  const unsigned char *usrc = (const unsigned char *) src;

  do {
    *udst++ = *usrc;
  } while (*usrc++);
  return dst;
}

字符串長度和null 字符分配足夠的空間

strlen()返回字符串長度 這不包括最終的null 字符

int main() {
  char srcString[] = "We promptly judged ...";
  char dstString[strlen(srcString) + 1]; // Add 1
  copy(dstString,srcString);
}

*1 C 的strcpy()char *strcpy(char * restrict s1, const char * restrict s2);

注意restrict 這意味着通過指針進行的訪問不受其他代碼的影響。 例如源字符串和目標不會重疊。

// Better as
char *copy(char* restrict dst, const char* restrict src) {

OP 在copy()中使用strlen() )處理重疊 memory 的良好第一步(見下文),但strcpy()不需要處理 - 建議copy()不處理重疊。

char *copy_handle_overlap(char* dst, const char* src) {
  return memmove(dst, src, strlen(src) + 1);
}

*2 C 字符串函數有:

對於本子條款中的所有函數,每個字符都應被解釋為好像它具有unsigned char類型(因此每個可能的 object 表示都是有效的並且具有不同的值)。

這對於區分+0-0的稀有非 2 補碼很重要。

預計 C2X 將放棄對非 2 的補碼支持。

暫無
暫無

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

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