Strcpy在C中的实现
因此,我在C中看到了这个Strcpy在C中的实现,c,strcpy,C,Strcpy,因此,我在C中看到了这个strcpy实现: void strcpy1(char dest[], const char source[]) { int i = 0; while (1) { dest[i] = source[i]; if (dest[i] == '\0') { break; } i++; } } 对我来说,它甚至将\0从源复制到目标 我也看
strcpy
实现:
void strcpy1(char dest[], const char source[])
{
int i = 0;
while (1)
{
dest[i] = source[i];
if (dest[i] == '\0')
{
break;
}
i++;
}
}
对我来说,它甚至将\0
从源复制到目标
我也看过这个版本:
// Move the assignment into the test
void strcpy2(char dest[], const char source[])
{
int i = 0;
while ((dest[i] = source[i]) != '\0')
{
i++;
}
}
对我来说,当尝试将\0
从source
分配到dest
时,它将中断
正确的选择是什么,复制还是不复制?你错了。两者都复制
\0
(NUL终止符)字符。您必须始终复制NUL终止符,否则字符串将被破坏:您永远不知道它何时/何地结束。两者都复制'\0'。如果要完全模拟原始strcpy,必须这样做,因为两者都复制了终止符,因此都是正确的
请注意,strcpy2()
首先进行赋值(复制),然后进行比较。因此,它会在意识到之前复制终结者,然后停止
另外,请注意,名称以
str
开头的函数是保留的,因此这两个函数实际上都不是有效的“用户级”代码。strcpy1()和strcpy2()
都是这样做的。两者都将NUL字符复制到目标数组的末尾。代码应如下所示:
char * strcpy(char *strDest, const char *strSrc)
{
assert(strDest!=NULL && strSrc!=NULL);
char *temp = strDest;
while(*strDest++ = *strSrc++); // or while((*strDest++=*strSrc++) != '\0');
return temp;
}
您可以不删除第二行char*temp=strDest
并直接返回strDest
。这将导致返回内容出错。例如,它不会返回正确的值(应该是22),而是检查返回的char*
的长度
char src_str[] = "C programming language";
char dst_str[100];
printf("dst_str: %d\n", strlen(strcpy(dst_str, src_str)));
char*strcpy(char*strDest,const char*strSrc)
{
断言(strDest!=NULL&&strsrrc!=NULL);
断言(strSrc+strlen(strSrc)strDest);//参见注释
char*temp=strDest;
而(*strDest++=*strSrc++);
返回温度;
}
//如果没有第4行上的检查,新字符串将覆盖旧字符串,包括null清除器,导致复制无法停止。以下是完整的实现。您不必在第一个字符串的末尾考虑“0”,它将根据逻辑自动从第二个字符串复制。
//str copy function self made
char *strcpynew(char *d, char *s){
char *saved = d;
while ((*d++ = *s++) != '\0');
return saved; //returning starting address of s1
}
//default function that is run by C everytime
int main(){
//FOR STRCPY
char s1[] = "rahul"; //initializing strings
char s2[] = "arora"; //initializing strings
strcpynew(s1, s2);
printf("strcpy: %s\n", s1); //updated string after strcpy
}
两者都复制终止符,因此都是正确的 strcpy2()首先进行复制,然后进行比较。因此,它将复制终止符并停止
名称以str开头的函数是保留的,因此使用任何其他变量或命名类型您可以使用此代码,越简单越好! 在while()中,我们逐字符复制字符,并将指针移动到下一个字符。当最后一个字符\0通过并复制时,同时接收0并停止
void StrCopy( char* _dst, const char* _src )
{
while((*_dst++ = *_src++));
}
复制空终止符是正确的。两个版本都会这样做。当
在\0
上中断时,副本已经由dest[i]=source[i]
@simonc完成-您的注释将是正确的答案'\0'
指示字符串的结尾,它应该在那里,否则您将不知道字符串的结尾。因此(dest[i]的最后一个赋值=源[i])返回“\0”?我认为赋值总是返回“1”或true(如果赋值正确)。@赋值根据赋值进行计算。我一点也不知道你说的“正确分配”是什么意思。“错误分配”的例子是什么?我认为这个概念在C中并不存在。根据C 2011 7.31.12和.13,只保留以“str”开头的名称和小写字母。如果strcpy函数中dest的大小未知,该怎么办?如何进行安全复制?有没有比上述更好的方法?请注意:在您的示例中,您存储dest
字符串的开头,以避免在复制完成后返回其结尾,这是正确的,但是他的函数(具有返回类型void
和)按值传递参数,因此(本地)指针算法不会影响外部的指针,因此temp
(即起始地址)不是必需的,不是吗?虽然此代码片段可能是解决方案,但确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。
void StrCopy( char* _dst, const char* _src )
{
while((*_dst++ = *_src++));
}