Где ошибка в моей программе на C, которая генерирует все возможные перестановки строки?
-
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
после первых трех символов спросите себя, как бы он узнал, что нужно это сделать.