все возможные комбинации в строке в C - PullRequest
2 голосов
/ 16 сентября 2011

Я пытаюсь напечатать все возможные комбинации строки 'abc', используя C. Может кто-нибудь помочь указать, где в этом коде я ошибаюсь?Я использую алгоритм, упомянутый здесь: http://hackercs.com/videos/Combinations-of-a-String-Part-2/ Спасибо за ваше время и помощь.(Кстати, цель здесь - использовать рекурсию)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


 void combination(char **curString,int allowedStart,char **outBuffer,int length)
{
//check for allowed chars.
// if not return.
// else
// for each char in the allowed char
// copy into buffer
//print buffer
//combine buffer and over next allowed chars
//remove from buffer.

if (allowedStart == length)
    return;
else    
   {
int curr;
for (curr = allowedStart;curr<length; curr++){
//need to copy 'a' into outbuffer and keep appending to outbuffer.
printf("allowedStart = %d\n",allowedStart);
printf("curr = %d\n",curr);

(*outBuffer)[curr] = (*curString)[allowedStart];
printf("outbuff is %s\n",*outBuffer);       

combination(curString,curr+1,outBuffer,length);
    printf("return\n");
(*outBuffer)[length-1] = '\0';

   } //else
} //for 
}

 main()
 {
 char *var = "abc";
 int length = strlen(var);
 printf("length = %d\n",length);

 char *outBuffer = malloc ( length * sizeof (char));
 bzero(outBuffer,3);
 combination(&var,0,&outBuffer,length);

  }

Ответы [ 3 ]

1 голос
/ 03 октября 2011

Получил это работает.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


void combination(char **curString,int allowedStart,char **outBuffer,int length)
{
    //check for allowed chars.
    // if not return.
    // else
    // for each char in the allowed char
    // copy into buffer
    //print buffer
    //combine buffer and over next allowed chars
    //remove from buffer.
    int curr;

    if ( allowedStart == length )
        return;
    else    {

            for (curr = allowedStart;curr<length; curr++){
        //need to copy 'a' into outbuffer and keep appending to outbuffer.
        //      printf("allowedStart= %d  curr= %d \n",allowedStart,curr);

                (*outBuffer)[curr] = (*curString)[allowedStart];
                //adjust for appending.

                int i = 0;
                while (i < length)
                {
                    if ( ((*outBuffer)[i] == '\0') && ((*outBuffer)[i+1] != '\0') )
                    {
        //              printf("in here\n");
                        (*outBuffer)[i] = (*outBuffer)[i+1];
                        (*outBuffer)[i+1] = '\0';
                    }
                    i++;
                }

        //      printf("added curr%d %c \n",curr, (*outBuffer)[curr]);
                printf("***************************************COMBO: %s\n",*outBuffer);        
                allowedStart = curr+1;
        //      printf("allowedStart%d %c \n",allowedStart,(*curString)[allowedStart]);

                combination(curString,allowedStart,outBuffer,length);
        //      printf("removing%d %c\n",curr,(*outBuffer)[curr]);
                (*outBuffer)[curr] = ' ';   
        //      printf("**************RETURNCOMBO: %s\n",*outBuffer);       

        } //else
    } //for 
}

main()
{
    char *var = "abcd";
    int length = strlen(var);
    printf("length = %d\n",length);
//  printf("Intial word is %s\n",var);
    char *outBuffer = malloc ( (length+1) * sizeof (char));
    bzero(outBuffer,length);
    combination(&var,0,&outBuffer,length);

}
1 голос
/ 16 сентября 2011

Для начала, вы ошибаетесь:

 char *var = "abc";
 int length = strlen(var);
 printf("length = %d\n",length);

 char *outBuffer = malloc ( length * sizeof (char));
 bzero(outBuffer,3);

Это очень запутанный код.Он смешивает динамическую обработку длины буфера (вызов strlen()) со статическими (вызов 3 в вызове bzero()).Это также делает это неправильно, используя sizeof (char) (который гарантированно будет равен 1 языком C, и, следовательно, просто добавляет шум и путаницу).Кроме того, количество символов, необходимое для хранения 3-символьной печатаемой строки в C, не 3, а 4, поскольку для завершения '\0'.

нужен один символ.
0 голосов
/ 13 января 2018
#include <iostream>

#define PRINTLN(STR) std::cout << STR << std::endl
#define SWAP(ARRAY, I, J) if(I != J) { ARRAY[I] ^= ARRAY[J]; ARRAY[J] ^= ARRAY[I]; ARRAY[I] ^= ARRAY[J]; }

void PrintCombinations_Rec(char* str, size_t idx)
{
    const size_t len = strlen(str);
    if( len == idx)
        PRINTLN(str);
    else
    {
        for (size_t i = idx; i < len; ++i)
        {
            SWAP(str, idx, i);
            PrintCombinations_Rec(str, idx + 1);
            SWAP(str, i, idx);
        }
    }
}

void PrintCombinations(const char* input)
{
    const size_t len = strlen(input);
    char* str = new char[len + 1];
    strncpy_s(str, len + 1, input, len);

    // Recursive call
    PrintCombinations_Rec(str, 0);

    delete[] str;
}

int main(int argc, char** argv)
{
    PrintCombinations("ABCD");
    return EXIT_SUCCESS;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...