我试图重写strcpy函数,但我陷入其中,当第一个arg是字符的静态数组时,我的函数不运行,仅当它是分配的指针时才运行。我认为问题是我的函数中的realloc语句。请帮我解决我的问题...

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

int myStrlen(const char *);
char *myStrcpy(char *, const char *);

int main() {
    char str1[40];
    char str2[] = "one piece";
    char *str;
    str = (char*)malloc(1 * sizeof(char));
    myStrcpy(str, str2);
    printf("%s", str);
    myStrcpy(str1, str2);
    printf("%s", str1);
    return 0;
}

int myStrlen(const char *str) {
    int i = 0, len = 0;
    while (str[i++] != '\0') {
        len++;
    }
    return len;
}

char *myStrcpy(char *str1, const char *str2) {
    int len1, len2;
    len1 = myStrlen(str1);
    len2 = myStrlen(str2);
    str1 = (char*)realloc(str1, len2 * sizeof(char));
    for (int i = 0; i < len2; i++) {
        str1[i] = str2[i];
    }
    str1[len2] = '\0';
    return str1;
}


请帮助我使我的代码使用指针工作...
顺便说一句,这是我的不使用指针的函数,有什么想法吗?

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

void myStrncpy(char str1[], char str2[], int n) {
    int i = 0;
    while (str2[i] != '\0' || i <= n) {
        str1[i] = str2[i];
        i++;
    }
    str1[i] = '\0';
}

最佳答案

您的第一个实现出于无效目的使用realloc()。对于标准函数strcpy(),假定str1指向具有足够空间来存储str2副本的数组。

如果您打算实现与strcpy不同的语义,请使名称更明确,然后将其传递给目标指针的地址,因为realloc()可能返回不同的指针。在您的示例中,str的原始值在调用myStrcpy()之后使用,这是不正确的。

您的第二种实现几乎是正确的:


您应将size_t用作i的类型。在当前系统上,字符串可以长于INT_MAX
您应该将源字符串设置为const
myStrncpy应该在i到达n时停止,使用&& i < n
在取消引用i < n指针之前测试str2允许将无效指针与n的零值一起传递,这很有用。
myStrcpymyStrncpy应该返回目标指针。
请注意,myStrncpy的语义比strncpy好得多。标准函数strncpy不能满足大多数程序员的期望。它的语义容易出错,不应使用它来避免潜在的混乱。


这是一个简化的版本:

#include <stdlib.h>

size_t myStrlen(const char *str) {
    size_t len = 0;
    while (str[len] != '\0') {
        len++;
    }
    return len;
}

char *myStrcpy(char *str1, const char *str2) {
    size_t i = 0;
    while (str2[i] != '\0') {
        str1[i] = str2[i];
        i++;
    }
    str1[i] = '\0';
    return str1;
}

char *myStrncpy(char *str1, const char *str2, size_t n) {
    size_t i = 0;
    while (i < n && str2[i] != '\0') {
        str1[i] = str2[i];
        i++;
    }
    str1[i] = '\0';
    return str1;
}

07-24 13:55