首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中不使用<string.h>实现strcpy()函数

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

Stack Overflow用户
提问于 2020-05-02 07:14:51
回答 4查看 915关注 0票数 1

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

函数应该使用指针表达式,(*(d+i))

  • I不应该使用<string.h>

实现它

我正在用Visual 2019年编程。我在google中搜索了一些源代码并运行它们,但是我的程序有一个逻辑错误。每次节目马上结束。我不知道我做错了什么。下面是我在Windows上的VisualStudio2019代码。请告诉我怎么回事。

代码语言:javascript
复制
#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) != '\0')
    {
        *(str1 + i) = *(str2 + i);
        i++;
    }
    *(str1 + i) = '\0';
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-02 07:48:06

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

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

代码语言:javascript
复制
#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

代码语言:javascript
复制
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()函数中将源字符串复制到目标字符串,接收预期的结果:

示例使用/输出

代码语言:javascript
复制
$ ./bin/mystrcpy
The result: Friends

仔细考虑一下,如果你还有其他问题,请告诉我。

票数 5
EN

Stack Overflow用户

发布于 2020-05-02 07:23:26

至少有两个问题:

  1. 字符串文本在C中是不可写的。通常情况下,其症状是崩溃(SIGSEGV)。
  2. 您不允许为自己的函数使用标识符strcpy。使用另一个名称.

至少有三个清晰的代码问题:

为了使其正确,typed.

  • str1str2都是泛型名称,
  1. int main()转换为int main(void)。它们没有指示哪个是源,哪个是目标指针。my_strcpy(char *dest, char *src)
  2. I'd使用size_t i作为索引计数器而不是int,因为这是类型所有的字符串长度函数和sizeof操作符返回。它也是一个无符号类型,可以复制非常长的字符串:-) #include <stddef.h>.

之后可以使用size_t

票数 3
EN

Stack Overflow用户

发布于 2020-05-02 07:35:41

你想要这个

代码语言:javascript
复制
...
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
...

其余的请读詹斯的答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61555728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档