Estoy construyendo un programa de cifrado pero no puedo encontrar la manera de devolver una matriz de char [] mi método de cifrado

char *cipherinput(int ciphercount){
int i=0;
char *cipher[MAX_CIPHER_SIZE];


if(ciphercount>=2){
    printf("Enter the Cipher!\n");
    //loop through and add
    for(i=0;i<ciphercount;i++){
        scanf(" %c", cipher[i]);
    }
}

   return cipher;
}

Mi método principal tiene

#define MAX_CIPHER_SIZE 16
#define MAX_TEXT_SIZE 256
int main()
{
   int ciphercount=0, textcount=0,i=0,j=0,k=0;
   int *cipher_, *text_, N=0,N_;

   printf("Enter size of Cipher!\n");
   scanf("%d", &ciphercount);

   if(ciphercount>=2){
    cipher_ = cipherinput(ciphercount);
   }
   else{
     printf("Start again / Cipher size should be greater or equal to 2\n");
     main();
   }
   return 0;
 }

He intentado varios métodos como char ** (string) sin éxito.

c
2
John Nyingi 7 mar. 2018 a las 00:51

3 respuestas

La mejor respuesta

Está devolviendo un puntero para apilar memoria, que es un comportamiento indefinido. Lo más probable es que su cadena devuelta se corrompa poco después de que la función regrese o después de la invocación de otra función.

Esto está más cerca de lo que quieres:

char* cipherinput(int ciphercount) {
    int i=0;
    char cipher[MAX_CIPHER_SIZE+1]; // +1 to guarantee null termination.
    cipher[0] = '\0';

    if(ciphercount>=2){
        printf("Enter the Cipher!\n");
        //loop through and add
        for(i=0;i<ciphercount;i++){
            scanf(" %c", cipher[i]);
        }
        cipher[ciphercount] = '\0'; // null terminate
    }

    return strdup(cipher);   // this is the same as ptr=malloc(strlen(cipher+1)) followed by strcpy(ptr,cipher)
}

La función devuelve una copia de la cadena que escribió el usuario. Se espera que el llamante de esta función invoque free en el puntero devuelto después de que haya terminado con él. Si ciphercount < 2, la función devolverá una cadena vacía.

3
selbie 6 mar. 2018 a las 22:02

Forma normal 1, Asignar resultado en función y devolverlo

    char *cipherinput(int ciphercount){
      char *cipher = malloc(MAX_CIPHER_SIZE);
...
      return cipher;
    }

Tenga en cuenta que su interlocutor deberá free el resultado

Modo normal 2, la persona que llama crea y pasa el búfer de resultados

void cipherinput(int ciphercount, char * cipher){
 ....
}

La persona que llama va

    char cipher[MAX_CIPHER_SIZE];
    cipherinput(x, cipher);

Forma normal # 3. Tiene fijo buffer estático en función. NOTA: ESTO NO ES ALQUILER O HILO SEGURO

char *cipherinput(int ciphercount){
  static char cipher[MAX_CIPHER_SIZE];
  .....
  return cipher;
}

En general, el número 2 es probablemente el mejor, ya que es menos probable que tenga fugas

0
pm100 6 mar. 2018 a las 22:00

Si desea utilizar char *cipher fuera de su función

char *cipherinput(int ciphercount){
     int i=0;
     char *cipher[MAX_CIPHER_SIZE];
     //...
     return *cipher;
}

Necesita asignar memoria para su búfer de cifrado. Su cipher[MAX_CIPHER_SIZE] no existirá una vez que regrese la función cipherinput. Este es el enfoque más común:

 char* cipherinput(int ciphercount) {
        // ...
        char *cipher = malloc( sizeof(char) * (MAX_CIPHER_SIZE+1) ); // +1 to guarantee null termination.

        //...
        return cipher;
    }

Este enfoque requiere que recuerde liberar la memoria asignada para cipher una vez que no la necesite.

En los sistemas integrados, es posible que desee evitar la asignación de memoria, ya que la asignación y la desasignación pueden no ser operaciones oportunas. En tal caso, el mejor enfoque es pasar un búfer a su función:

char cipher[MAX_CIPHER_SIZE+1];    // buffer outside the function
cipherinput(ciphercount, cipher);  // function call

Implementación de funciones:

void cipherinput(int ciphercount, char * cipher){
 // access elements of cipher buffer via cipher[i]);
 // ...
}
1
sg7 6 mar. 2018 a las 22:28