在 C 中不使用 <string.h> 实现 strcpy() 函数

implementing a strcpy() function without using <string.h> in C

我的任务是这样的:我应该在以下约束下实现 strcpy 函数:

  1. 函数应该使用指针表达式(*(d+i))
  2. 我应该在不使用的情况下实现它 <string.h>

我在 Visual Studio 2019 年编程。 我在google和运行中搜索了一些源代码,但是我的程序有一个逻辑错误。程序每次都会立即结束。我不知道我做错了什么。 这是我在 Visual Studio 2019 年 Windows 上的代码。请告诉我哪里出了问题。

#include <stdio.h>
void strcpy(char*, char*);

int main()
{
    char* sen1 = "Hello";
    char* sen2 = "Friends";

    strcpy(sen1, sen2);

    printf("The result: %s\n", sen1);

    return 0;
}

void strcpy(char* str1, char* str2)
{
    int i = 0;
    while (*(str2 + i) != '[=11=]')
    {
        *(str1 + i) = *(str2 + i);
        i++;
    }
    *(str1 + i) = '[=11=]';
}

两个问题,至少:

  1. 字符串文字在 C 中不可写。症状通常是崩溃 (SIGSEGV)。
  2. 您不能将标识符 strcpy 用于您自己的函数。使用其他名称。

三个干净的代码问题,至少:

  1. int main() 变成 int main(void) 以使其正确输入。
  2. str1str2 是太通用的名称。它们不指示哪个是源指针,哪个是目标指针。 my_strcpy(char *dest, char *src) 呢?
  3. 我会使用 size_t i 作为索引计数器而不是 int,因为这是所有字符串长度函数和 sizeof 运算符 return 的类型。它也是一个无符号类型,可以复制 真正 长字符串:-) size_t#include <stddef.h>.
  4. 之后可用

你想要这个:

...
char* source = "Hello";
// or char source[] = "Hello";
char destination[1000];      // destination buffer long enough for playing around

my_strcpy(destination, source);

printf("%s\n", destination);   // should print "Hello" if my_strcpy is corect
...

其余部分请阅读 Jens 的回答。

除了需要为 sen1 提供可写存储外,您还应该在取消引用 str2 之前检查以确保函数中的 str2 != NULL (否则,即使您修复了所有其他错误——可能会导致段错误)

例如,在您的代码中,您可以定义一个常量以用于设置 sen1 array 的大小(或者您可以使用 malloc()calloc()realloc() -- 留着以后用)。使用你可以做的数组,例如

#include <stdio.h>
#include <stdlib.h>

#define MAXC 64     /* if you need a constant, #define one (or more) */
...
int main (void)
{
    char sen1[MAXC] = "Hello";
    char *sen2 = "Friends";

    mystrcpy (sen1, sen2);

    printf ("The result: %s\n", sen1);

}

在你的 strcpy 函数中,在你的函数中使用 str2 之前检查 str2 不是 NULL,例如

char *mystrcpy (char *dest, const char *src)
{
    char *p = dest;

    if (!src || !dest) {            /* ensure src or dest is not NULL */
        fputs ("error: src or dest parameters NULL in mystrcpy().\n", stderr);
        exit (EXIT_FAILURE);
    }

    do                              /* loop */
        *p++ = *src;                /* copy each char in src to dest */
    while (*src++);                 /* (including the nul-termianting char) */

    return dest;                    /* return pointer to dest */
}

现在您将在您的(重命名的)mystrcpy() 函数中将您的源字符串复制到您的目标字符串,接收您期望的结果:

例子Use/Output

$ ./bin/mystrcpy
The result: Friends

检查一下,如果您还有其他问题,请告诉我。

在其他好的答案中,只是关于 strcpy 函数的实现,而不是对实际代码的详细问题分析,另一种方法是:

char * n_strcpy(char * dest, char const * src)
{
    if (dest == NULL || src == NULL)
    {
        return NULL;
    }

    char *ptr = dest;

    while ((*dest++ = *src++));

    return ptr;
}