在C语言中尝试复制字符串时,第一个字符未被复制。

3

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

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

当我复制这些字符串时,第一个字母似乎没有被复制。
我的任务实际上更大,试图以相反的顺序复制这些字符串,但我相信找出这里出了什么问题将有助于我成功。
任何帮助都将受到赞赏。
编辑:已解决,代码现在可以工作。

1
我很好奇第二个循环的输出是什么,因为p已经走到了未定义行为的领域,甚至没有被评估就被取消引用。而且你应该传递p,h,而不是&p, &h。你的第二个字符串未填充且不确定,正在破坏你的第一个字符串,你确定这些参数的顺序正确吗? - WhozCraig
5个回答

5

以下是反转字符串的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--;
   }
}

3

这里有很多问题...

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

  2. 你在循环中反向复制,将h赋值给p

  3. 你的打印循环是错误的:终止条件应该是*p而不是p。而且p已经被你的复制代码推到了字符串的末尾。

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

  5. 你应该将源字符串参数声明为const。这将会检测到上面的第二个问题。


2

迭代后:

while(*p++=*h++){
    ;
}

完成后,p指向已复制字符串的终止字符\0。此后,在这个循环中:

while (p){
    printf("%c",p[i++]);
}

p将指向该元素。你将在它之后打印字符(即字符串之外),这个循环只有在p变为0时才会终止(p的值超过整数上限后会发生)。实际上,程序在此之前就会崩溃。虽然您用于复制字符串的方法可能非常花哨,但在几乎所有情况下都不是很有用。我建议您直接使用标准库函数,如strcpy


你说得对,我应该使用常规函数,但是任务要求我自己编写。谢谢。 - Assaf

2
使用此方法实现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;
}

1

这是可行的代码:

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

您的反馈非常重要,谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接