试图复制c中的字符串,第一个字母是';不要被抄袭

试图复制c中的字符串,第一个字母是';不要被抄袭,c,c-strings,C,C Strings,我试图写一个非常简单的程序,但我在这里找不到问题。尝试了不同的方法,这就是我现在尝试的: #include <stdio.h> void copyStr(char *p, char *h){ int i=0,j=0; int length=0; length=strlen(p); int l=length; for (i=0; i<length; i++){ h[i]=p[l-1]; l--; } char

我试图写一个非常简单的程序,但我在这里找不到问题。尝试了不同的方法,这就是我现在尝试的:

   #include <stdio.h>
void copyStr(char *p, char *h){

   int i=0,j=0;
   int length=0;
   length=strlen(p); int l=length;
   for (i=0; i<length; i++){
       h[i]=p[l-1];
       l--;
   }
   char *temp=&h[0];
   for (i=0; i<length; i++){
       printf("%c",temp[i]);
   }


}
main(){

    char p[]="abcde";
    char h [sizeof(p)];
    copyStr(p,h);
}
#包括
void copyr(char*p,char*h){
int i=0,j=0;
整数长度=0;
长度=strlen(p);int l=长度;

对于(i=0;i

while(*p++=*h++){
    ;
}
完成后,
p
将指向字符串副本的终止
\0
字符。在此循环中,结束后:

while (p){
    printf("%c",p[i++]);
}
p将指向该元素。您将在其后面打印字符(即字符串外),并且此循环仅在p变为0时终止(这将在整数溢出后发生)。实际上,该程序在此之前会崩溃。您用于复制字符串的黑客方法可能非常奇特,但并非在几乎所有情况下都非常有用。我建议您只需使用标准库函数,如
strcpy

这里有许多问题

  • p
    h
    作为参数传递,不要使用
    &p
    。变量
    p
    已经是指向字符数组的指针。
    使其成为指向指针的指针

  • 您正在循环中向后复制,将
    h
    分配给
    p

  • 您的打印循环已中断:终止条件应为
    *p
    而不是
    p
    。此外,您的复制代码已将
    p
    提前到字符串末尾

  • swap()
    是一个误导性的名称。它不是在交换两个字符串。它是在将一个字符串复制到另一个字符串。即使以后添加反转,它仍然是在反转,而不是在交换

  • 您应该将源字符串参数声明为
    const
    。这将检测到上面的问题2


  • 这是反转字符串的C代码

    void reverse(char *string) 
    {
       int length, c;
       char *begin, *end, temp;
    
       length = strlen(string);
    
       begin = string;
       end = string;
    
       for ( c = 0 ; c < ( length - 1 ) ; c++ )
          end++;
    
       for ( c = 0 ; c < length/2 ; c++ ) 
       {        
          temp = *end;
          *end = *begin;
          *begin = temp;
    
          begin++;
          end--;
       }
    }
    
    void reverse(字符*字符串)
    {
    int长度,c;
    字符*开始,*结束,温度;
    长度=strlen(字符串);
    开始=字符串;
    结束=字符串;
    对于(C=0;C<(长度为1);C++)
    end++;
    对于(C=0;C<长度/ 2;C++)
    {        
    温度=*结束;
    *结束=*开始;
    *开始=温度;
    begin++;
    结束--;
    }
    }
    
    这是有效的代码:

    #include <stdio.h>
    void copyStr(char *p, char *h){
    
       int i=0,j=0;
       int length=0;
       length=strlen(p); int l=length;
       for (i=0; i<length; i++){
           h[i]=p[l-1];
           l--;
       }
       char *temp=&h[0];
       for (i=0; i<length; i++){
           printf("%c",temp[i]);
       }
    
    
    }
    main(){
    
        char p[]="abcde";
        char h [sizeof(p)];
        copyStr(p,h);
    }
    
    #包括
    void copyr(char*p,char*h){
    int i=0,j=0;
    整数长度=0;
    长度=strlen(p);int l=长度;
    
    对于(i=0;i使用此函数实现strcpy

    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;
    }
    

    我很好奇第二个循环的输出是什么,因为
    p
    很好地进入了未定义行为的领域,甚至被评估得更少。你应该传递
    p,h
    ,而不是
    &p,&h
    。你的第二个字符串,未填充和不确定,正在吹走你的第一个,你确定那些参数是正确的吗按照正确的顺序?你是对的,我应该使用常规函数,但作业说明我应该自己更正它。谢谢。