2016-01-14 4 views
-1

Вот код:Я попробовал программу, сделать работу функции (strdup) вручную, но это дало мне ошибку после того, как я ввожу строку

#include <stdio.h> 

char *strDup(char *,int); 

int main (void) 
{ 
    char p[1000]; 
    int n=0; 
    char *q; 

    printf("plz enter a string : "); 
    gets(p); 
    printf("plz enter the number of the characters you want to duplicate : "); 
    scanf("%d",&n); 
    printf("the duplicated string is : "); 
    q=strDup(p,n); 
    printf("%s\n",q); 
    return 0; 
    } 
char *strDup(char *p,int n) 
{ 
    int ctr=0; 
    int help; 
    char q[1000]; 

    for(int i=0;p[i]!='\0';i++) 
    { 
     ctr++; 
    } 
    if (n<0) 
    { 
     printf("!!ERROR!!"); 
    } 
    else if(n==0||n>ctr) 
    { 
     for(int i=0;p[i]!='\0';i++) 
     { 
      help=p[i]; 
      p[i]=q[i]; 
      q[i]=help; 
     } 
    } 
    else 
    { 
     for(int i=0;p[i]<=n;i++) 
     { 
      help=p[i]; 
      p[i]=q[i]; 
      q[i]=help; 
     } 
    } 
    return q; 
} 

Даже после того, как редактировал его, он не работает , и я попытался сделать код максимально простым для меня, поэтому, пожалуйста, не делайте это тяжело для меня.

+0

'char * p; получает (* p); 'неправильно, вам нужна комната:' char p [100]; get (p); 'в любом случае, никогда не использовать' gets' use 'fgets (s, sizeof s, stdin);' –

+0

ok после редактирования он работает на всех условиях, кроме последнего, и самый важный –

+0

Joachim отвечает на это, вы возвращают адрес локальной переменной, возвращают выделенную строку: 'q = malloc (n + 1); ... return q; ' –

ответ

1

Это потому, что вы возвращаете указатель на локальную переменную, массив q. Как только функция возвращает эту переменную, она больше не существует, и попытка разыменования указателя приведет к неопределенным поведением.

Если вы читаете о функции strdup, вы увидите, что она динамически выделяет память, которую она возвращает вызывающему.