2009-03-25 3 views
1

나는 문자열의 모든 가능한 순열을 생성하는 C 프로그램을 작성하려고 노력해왔다. 나는 성공했지만 각 순열 후에 가비지 값을 생성합니다. 가능한 원인을 찾는데 도와주세요. 초기화와 관련이 있습니까? 코드 :문자열의 모든 가능한 순열을 생성하는 C 프로그램의 버그는 어디에 있습니까?

#include <stdio.h> 
void permute(char number[],char out[],int level,int used[]); 
int main() 
{ 
    char number[] = "123"; 
    char out[3] = "asd"; // Random initialization 
    int used[] = {0,0,0}; // To check if number has been used in the string output 
    permute(number,out,0,used); 
} 
void permute (char number[],char out[],int level,int used[]) 
{ 
    if (level == 3) 
    { 
     printf("%s\n",out); 
     return; 
    } 
    int i; 
    for(i = 0; i < 3;i++) 
    { 
      if(used[i] == 1) continue; 
      out[level] = number[i]; 
      used[i] = 1; 
      permute(number, out, level + 1,used); 
      used[i] = 0; 
    }  
} 

답변

2

내 C는 매우 녹슨이지만, 내 생각 엔 그것이 당신의 문자 배열이 null 종료되지는 사실에 의해 발생한다는 것입니다.

하나의 옵션은 개별적으로 각 문자를 인쇄 할 수 있습니다 : 당신이 처음 세 문자 후 out의 내용을 인쇄를 중지해야한다고 생각하는 경우

if (level == 3) 
{ 
    int p; 
    for(p=0 ; p<3 ; p++) { 
     printf("%c", out[p]); 
    } 
} 
+0

putchar() 또는 putc()가 전체 printf()보다 약간 좋을 수도 있지만별로 중요하지 않습니다. –

+0

지금까지 작동합니다! 나는 그것을 종료 null 및 지금 잘 작동합니다. 이는 Java에서 C로 잠시 동안 전환 할 때 발생하는 결과입니다. 고마워요! –

+0

@Chris Lutz : 내가 말했듯이, 내 C는 매우 녹슬다 .-D –

0

, 그렇게하는 것이 알고 얼마나 자신에게 물어.

+0

코멘트를 위해 Thnx! 배열의 한계를 3으로 설정 했으므로 자동으로 멈출 곳을 알았습니다. 이제 이해가된다 :-). –

+0

C * never *는 자동으로 멈출 곳을 알고 있습니다. ;-) –

+0

LOL. 나는 그 점을 좋아한다. – euphoria83

2

char out [3] = "asd"; // 무작위 초기화

이것을 [4]로 변경하면 종료 문자 \ 0 문자를위한 공간이 생기며 예상대로 작동합니다.

+1

[]. – sigjuice

관련 문제