复制字符串函数,复制字符串不在函数本身打印

时间:2015-07-03 11:44:29

标签: c string function pointers dynamic-memory-allocation

我正在使用指针动态编写一个复制字符串程序。该函数从main()调用,复制的字符串显示在main()中,但当我尝试在函数本身中显示复制的字符串时,只有光标闪烁。

这是我的代码:

#include<stdio.h>
#include<stdlib.h>

void copystr(char *p,char *s);

int main ()
{    
    char str[50],*ptr,*p;
    printf("enter the string\n");
    gets(str);

    ptr=malloc(50*sizeof(char));
    copystr(ptr,str);

    getch();
    return 0;
}

void copystr(char *p,char *s)
{          
    s=malloc(50*sizeof(char));
    while(*s!='\0')
    {   *p=*s;
        s++;
        p++;
    }
    *p='\0';

    printf("copy string is  %s", p);   // if i display this printf in main 'p' prints fine, but here no output
    free(p);
}     

可能是什么原因?

3 个答案:

答案 0 :(得分:3)

<强>问题

  1. 永远不要使用gets()。它严重受缓冲区溢出问题的影响。请改用fgets()
  2. sizeof(char)中的1保证为C。乘以sizeof(char)实际上是多余的。
  3. 首先,您在s中接收copystr()作为传入参数之一,然后立即执行s=malloc(50*sizeof(char));。在这里,您将丢失传入的指针。所有进一步的操作都毫无意义。
  4. 如果失败,malloc()将返回NULL。在这种情况下,进一步使用返回的指针将导致undefined behaviour
  5. 如果成功,
  6. malloc()会返回未初始化的内存。在malloc()之后,直接写while(*s!='\0')即读取未初始化内存的内容。调用undefined behaviour
  7. copystr()内,您正在递增收到的指针p,并在复制后重新添加空终止符。因此p的当前值指向null终止符。因此,在p中使用printf()根本不会为您提供任何输出。
  8. <强>溶液

    1. ptr之后malloc()添加NULL检查以检查是否成功。
    2. 移除malloc()s上的copystr()
    3. 使用另一个临时指针来保存p的传入值。在您使用p获取存储的值后,使用临时指针打印复制的字符串。

答案 1 :(得分:3)

     printf("copy string is  %s", p);   // if i display this printf in main 'p' prints fine, but here no output

因为p没有指向该函数中字符串的开头(即使您已使用s=malloc(50*sizeof(char))修复了问题)。

如果您:

   free(p);

就像你现在拥有它一样,你也无法使用原版ptr

答案 2 :(得分:0)

你不需要函数中的malloc - 它会删除你传递给函数的数据 - 尝试重新运行函数中的代码

删除该行

s=malloc(50*sizeof(char));

另外,您可能希望在调用复制例程之后将一些东西放在main中以打印出您复制的函数,这样您就知道它有效了。 (还要注意在所有p ++操作之后用指针p打印字符串的问题,如其他答案所述)

下面的工作代码包含这些更改 - 请注意,最好不要使用获取... scanf完成工作...

      #include<stdio.h>
      #include<stdlib.h>

      void copystr(char *p,char *s);

    int main ()
    {

    char str[50],*ptr,*p;

   printf("enter the string\n");
   //       gets(str);
   scanf("%s",str);

      ptr=malloc(50*sizeof(char));
      copystr(ptr,str);

           printf("copy string is  %s\n", ptr);   // if i display this printf in main 'p' prints fine, but here no output
       free(ptr);

   //         getch();

     return 0;
  }

   void copystr(char *p,char *s)
 {          

     while(*s!='\0')
     {   *p=*s;
          s++;
          p++;
        }
        *p='\0';



       }      

使其在函数中起作用....参见

      #include<stdio.h>
      #include<stdlib.h>

      void copystr(char *p,char *s);

    int main ()
    {

    char str[50],*ptr,*p;

   printf("enter the string\n");
   //       gets(str);
   scanf("%s",str);

      ptr=malloc(50*sizeof(char));
      copystr(ptr,str);

       free(ptr);

   //         getch();

     return 0;
  }

   void copystr(char *p,char *s)
 {          
     int i=0;
     while(*s!='\0')
   {   *(p+i)=*s;
          s++;
          i++;
        }
 *(p+i)='\0';

           printf("copy string is  %s\n", p);   // if i display this printf in main 'p' prints fine, but here no output


       }