尝试使用指针重新创建strcpy函数

时间:2019-05-08 02:35:47

标签: c pointers

我试图通过在C中重新创建strcpy函数来学习指针。只要有空格,请在输入字符串中制表符(英语字符以外的其他字符),该函数便停止工作。

有人可以解释为什么吗? 感谢所有答案

#include <stdio.h>

void strcpys(char *s, char *t);
int main() {
    char *ms;
    char *mt;

    mt = "ABCDEFGAAA,AAAAA";
    strcpys(ms, mt);
    printf("%s\n", ms);
    printf("%s\n", mt);
    return 0;
}

void strcpys(char *s, char *t) {
    while ((*s = *t) != '\0') {
        s++;
        t++;
    }
}

1 个答案:

答案 0 :(得分:3)

您的strcpys函数正常,但是main函数出现问题:

  • 传递给strcpys的目标参数是未初始化的指针。这具有不确定的行为,很可能是分段错误。相反,您应该将一个pinter传递到一个char,其大小足以容纳源中的所有字符以及一个空字节终止符。

还有一些可能的改进:

  • strcpys应该返回目标指针
  • 源指针应声明为const char *
  • 参数名称应减少混乱

这是更正的版本:

#include <stdio.h>

char *strcpys(char *dest, const char *src);

int main() {
    char ms[32];
    const char *mt = "ABCDEFGAAA,AAAAA";
    strcpys(ms, mt);
    printf("%s\n", ms);
    printf("%s\n", mt);
    return 0;
}

char *strcpys(char *dest, const char *src) {
    char *p = dest;
    while ((*p = *src) != '\0') {
        p++;
        src++;
    }
    return dest;
}

请注意,您可以将增量合并到作业中

char *strcpys(char *dest, const char *src) {
    char *p = dest;
    while ((*p++ = *src++) != '\0')
        continue;
    return dest;
}

请注意,如果目标指针指向源字符串内部,则这两个版本均具有未定义的行为。如果目标数组和源不重叠,或者目标位于比源字符串低的地址,则函数将按预期方式工作。如果源数组和目标数组重叠,则标准strcpy函数具有未定义的行为。