gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:37 24 4
gpt4 key购买 nike

我正在尝试通过在 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++;
}
}

最佳答案

你的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 函数具有未定义的行为。

关于c - 尝试使用指针重新创建 strcpy 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56032765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com