C: strcpy 函数中的一个错误,无法找到它

C: One error In strcpy function and cannot find it

我知道下面的这个 strcpy 函数不正确,但我似乎无法弄清楚我需要更改一两件事来修复它。任何帮助将不胜感激,因为我完全坚持这一点:

void strcpy(char *destString, char *sourceString)
{
       char *marker, *t;
       for(marker = sourceString, t = destString; *marker; marker++, t++)
       *t = *marker;
}  

strcpy() 是一个预定义函数,您正在尝试创建自己的 strcpy 函数。因此,当您编译程序时,您会遇到 冲突类型 错误。所以,首先重命名你的函数名。

嗯,这取决于你的环境..

例如,我看到一些我不喜欢的东西:

  • 您没有检查输入参数是否为 != NULL。这将导致*0访问

  • 我看到你没有用 '[=12=]' 字符(或 0)终止你的字符串。所以,在循环之后(请注意。)添加 *t = 0;

这是一个非常简单的方法:

void copy(char * src, char * dst){
    while(*src != '[=10=]'){
        *dst = *src;
        src++;
        dst++;
    }
    *dst = '[=10=]';
}

int main(int argc, char** argv){
    char src [] = "hello";
    char dst [] = "----";

    copy(src, dst);
    printf("src: %s\n", src);
    printf("dst: %s\n", dst );

}

有点像wildplasser的评论。首先,您遍历 src 指针。在 c 中,如果你有 '\0'(在一个格式正确的字符串中)那么你可以退出,因为它是最后一个字符。好的,您遍历 src 指针并将 src (*src) 的值分配给 dst (*dst) 的值,然后您只需增加两个指针...

全部

一个非常简单的 strcpy 函数是:

int strcpy(char *dest,char *source)
{
if (source==NULL)
{
 printf("The source pointer is NULL");
 return 0;
}
if (dest==NULL)
{
 dest=(char*)malloc((strlen(source)+1)*sizeof(char));
}
int i;
for (i=0;source[i]!='[=10=]';i++)
 {
  dest[i]=source[i];
 }
dest[i]='[=10=]';
return 1;
}

用这种方式复制字符串应该没有问题。始终使用索引而不是指针操作,这样更容易。

如果你使用 IDE,你应该学会使用调试功能来发现错误和问题,通常当你处理字符串时,最常见的运行时问题之一是缺少 '\ 0',它会自动让你的字符串函数进入它们不应该出现的内存区域。

如果您想实现自己的 strcpy(),那么我建议您实现 strncpy()。它最多会将 n-1 个字节从 source null-terminated character array 复制到 destination character array 并在 destination character array.

的末尾添加 null character
void strcpy(char *dest, const char *src, size_t n)
{
   if ((dest == NULL) || (src == NULL))
       return;
   int i;
   for(i=0; i<(n-1) && src[i]; i++)
       dest[i] = src[i];
   dest[i]='[=10=]';
}

它不会让 buffer overflow.

注意 - 我的实现不同于标准库 strncpy() 实现。标准库函数 strncpy() 最多复制 src 的 n 个字节。如果src的前n个字节中没有空字节,那么放在dest中的字符串就不会以空结尾。

I know that this strcpy function below is incorrect, but I cannot seem to figure out the one or two things I need to change to fix it.

你只需要在目标数组的末尾添加空字符。

void strcpy(char *destString, char *sourceString)
{
   char *marker, *t;
   for(marker = sourceString, t = destString; *marker; marker++, t++)
       *t = *marker;
   *t='[=11=]';
}