Где ошибка в моей программе на C, которая генерирует все возможные перестановки строки?

StackOverflow https://stackoverflow.com/questions/679889

  •  22-08-2019
  •  | 
  •  

Вопрос

Я пытался написать программу на языке Си, которая генерирует все возможные перестановки строки (например, 123 в коде ниже).Мне это удалось, но это генерирует некоторые мусорные значения после каждой возможной перестановки.Пожалуйста, помогите мне найти возможную причину.Это как-то связано с инициализацией?Код:

#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;
    }       
}
Это было полезно?

Решение

Мой C очень ржавый, но я предполагаю, что это вызвано тем фактом, что ваш символьный массив не завершается нулем.

Один из вариантов - распечатать каждый символ по отдельности:

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

Другие советы

выделите[3] = "asd";// Случайная инициализация

Измените это на out[4], чтобы у вас было место для завершающего символа \ 0, и он должен работать так, как вы ожидаете.

Если вы считаете, что следует прекратить печать содержимого out после первых трех символов спросите себя, как бы он узнал, что нужно это сделать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top