2009-03-25 6 views
1

私は文字列の可能なすべての順列を生成するCプログラムを書こうとしています(例えば、以下のコードでは123)。私は成功しましたが、可能な各順列の後にいくつかのゴミ値を生成します。考えられる原因を見つけるのを手伝ってください。初期化とは何か? コード:文字列のすべての可能な順列を生成する私の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で終了されていないことに起因するということです。

1つのオプションは、個々の文字をプリントアウトすることです:

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

putchar()またはputc()は、printf()よりも少し良いかもしれません。 –

+0

うん、それは今動作します!私はそれを終了し、今は正常に動作します。これは、JavaからCへの切り替えの影響だけではありません。どうもありがとう! –

+0

@Chris Lutz:私が言ったように、私のCは非常に錆びています.-D –

0

あなたはそれが最初の3つの文字の後にoutの内容を印刷を停止すべきだと思うなら、それはそうすることを知っているだろうか自問してみてください。

+0

コメントのためのThnx!私は配列の限界を3に設定して以来、自動的にどこを停止するかを知っていると思いました。わかった :-)。 –

+0

C * never *は自動的に停止する場所を知っています。 ;-) –

+0

LOL。私はCについてそれが大好きです – euphoria83

2

char out [3] = "asd"; //ランダムな初期化

これを[4]に変更すると、終了する\ 0文字のための余裕があり、期待通りに動作するはずです。

+1

または[]を出してください。 – sigjuice

関連する問題