2014-03-24 1 views
0
#include<stdio.h> 
#include <string.h> 
char *generate(char a[],int s,int e,char r[]) 
{ 
    if(s>e){ 
     printf("%s\n ",r); //Prints the correct value "rempD" here 
     return r; 
    } 
    int i,asci[128]={0}; 
    for(i=s;i<=e;i++) 
     if(asci[a[i]]==1) 
      break; 
     else 
      asci[a[i]]=1; 
    char t[i-s]; 
    t[i-s]='\0'; 
    for(i=i-1;i>=s;i--) 
     t[i-s]=a[i]; 
    if(r==0||strlen(t)>strlen(r)) 
     return generate(a,s+1,e,t); 
    else 
     return generate(a,s+1,e,r); 

} 
int main() 
{ 
    char a[]="prrempD"; 
    printf("Largest unique string:\n%s",generate(a,0,strlen(a)-1,NULL)); // But prints a garbage value here 
} 

이 함수는 문자열 내에서 가장 큰 고유 부분 문자열을 반환하는 데 사용됩니다. 문자 배열이 반환되면 가비지 값을 반환합니다.함수에서 문자 배열을 반환하면 가비지 값이 인쇄되지만 함수에서 제대로 인쇄됩니까?

+0

'char t [i-s]; t [i-s] = '\ 0';은 나쁘다. 아마도'char t [i-s + 1];을 원할 것이다. t [i-s] = '\ 0';'. – chux

답변

3

char t[i-s];은 스택에 할당되었으며 generate()에서 복귀하면 할당이 취소됩니다.

generate()에 대한 호출 외에도 살기를 원한다면 힙이나 다른 할당 방법을 사용해야합니다.

0

기본적으로 지역 변수에 대한 포인터를 반환하는 것으로 귀결됩니다.

generate은 을 호출 한 후 r이라는 네 번째 인수를 반환합니다. 이는 로컬 변수를 반환한다는 의미입니다. 함수를 떠나는 순간이 지역 변수의 내용은 유효하지 않습니다. 결과를 복사하려면 버퍼를 전달하거나 사본을 할당하고 (malloc 또는 그 밖의 방법을 통해) 포인터를 반환해야합니다.

관련 문제