-1

テキストファイルに文字列を追加しようとしていますが、奇妙な文字が表示されます。結果をコンソールに出力しようとすると、出力は正常になります。これは私がvimの出力として見ているものです。geditで見ると、奇妙なボックスが表示されます。

出力ファイル:

  A^CA^BB^A
  A^CB^BA^A
  B^CA^BA^A

期待される出力:

AAB
ABA
BAA

私の関数は、重複のない順列をテキストファイルに書き出す必要があります。

機能のコード:

void RecursivePermute (char *prefix, char *rest, int *ptr)
{
    char *temp = malloc(sizeof(char *));
    char *new_prefix = malloc(sizeof(char *));
    char *rest_left = malloc(sizeof(char *));
    char *rest_right = malloc(sizeof(char *));
    char *new_rest = malloc(sizeof(char *));
    char rest_char;
    int idx = 0;
    int first_occurance = 0;
    int i;
    FILE *file;
    strcpy(temp, rest);
    if (*rest == '\0')
    {
        *ptr += 1;
        printf("Permutation %d: %s\n", *ptr, prefix);
        file = fopen("permutations.txt", "a");
        fprintf(file,"%s\n",prefix);
        fclose(file);
        return;
    }
    else
    {
        size_t rest_size = strlen(rest);
        while (*rest != '\0')
        {

            first_occurance = (strchr(temp, *rest) - temp - idx);
            if (first_occurance == 0)
            {
                rest_char = *rest;
                rest_left = strncpy(rest_left, rest-idx, idx);
                rest_right = strncpy(rest_right, rest+1, rest_size-1);
                sprintf(new_rest, "%s%s", rest_left, rest_right);
                sprintf(new_prefix,"%s%s", prefix, &rest_char);
                RecursivePermute( new_prefix, new_rest, ptr);
            }
            rest++;
            idx ++;
        }
    }
}
4

2 に答える 2

0

1つは、&rest_charのprintfフォーマット指定子が間違っていることです。&rest_charは、nullで終了していないため、文字列として解釈できません。文字を印刷する場合は、%cを使用します。行は次のようになります。

sprintf(new_prefix,"%s%c", prefix, rest_char);

また、文字列をどのように割り当てているかを確認することもできます。sizeof(char *)のサイズを指定すると、ポインタのサイズのメモリ割り当てのみが作成されます。残りの文字列がそれよりも大きい場合、strcpyを実行するときにバッファオーバーランが発生します。

于 2012-11-18T04:07:23.730 に答える
0

を呼び出すとmalloc(sizeof(char *))、4バイト(64ビット用にコンパイルする場合は8バイト)のバッファーが割り当てられます。これはほぼ間違いなくあなたが望むものではありません。

次に、strcpy()長さをチェックしないものを使用します。私はもうほとんど使用しstrcpy()ません。

長さをチェックする、も使用strncpy()しますが、文字列が適切にnullで終了することを保証しないため、私はそれを嫌います。長さが4以上の文字列をコピーし、バッファが4文字しか保持できない場合、nullはありません。

だから、私はあなたのプログラムをデバッガーの下で実行していませんが、あなたがこれらすべての問題をまとめたとき、私はあなたのプログラムが誤動作していることに驚いていません。

于 2012-11-18T04:09:40.013 に答える