Página 1 de 1

StrReverse by linkgl

Publicado: 29 Sep 2011, 17:18
por linkgl
Lo usé en un problema que me dejaron resolver

Código: Seleccionar todo

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//StrReverse->
char *strrev(char *palabra)
{
  int largo,i,j;
  char *temp;
  largo=strlen(palabra);
  temp=(char *)malloc(largo);
  memset(temp,0,largo);
  for(i=largo-1,j=0;i>=0;i--,j++)
    temp[j]=palabra[i];
  return temp;
}
//->Uso
int main()
{
    printf(strrev("linkgl"));
    getchar();
    return 0;
}

Re: StrReverse by linkgl

Publicado: 29 Sep 2011, 22:36
por .::DoX::.
En tu función no agregas el caracter nulo al final de la cadena por lo que puede presentar fallas.

Corregido:

Código: Seleccionar todo

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//StrReverse->
char *strrev(char *palabra)
{
  int largo,i,j;
  char *temp;
  largo=strlen(palabra);
  temp=(char *)malloc(sizeof(char) * largo + 1);
  memset(temp,0,largo);
  for(i=largo-1,j=0;i>=0;i--,j++)
    temp[j]=palabra[i];
  temp[j] = '\0';
  return temp;
}
//->Uso
int main()
{
    printf(strrev("linkgl"));
    getchar();
    return 0;
}
Además en "string.h" existe una función llamada también strrev que hace lo mismo y tu usas el mismo nombre para tu función lo que puede dar algunos warnings.

Salud2

Re: StrReverse by linkgl

Publicado: 30 Sep 2011, 05:07
por linkgl
Gracias por tu corrección en realidad la función fué pensada para poder hacer un tipo "strrev" como el estandar que está en string.h PERO que funcione en binarios :P, por eso no agregué lo del caracter nulo Al publicarla aquí olvidé ese detalle y suprimí el parámetro de la longitud de la cadena por strlen para pasarlo de aplicarse a binarios a aplicarlo a cadenas sencillas pero se me fué el caracter nulo

Re: StrReverse by linkgl

Publicado: 10 Oct 2011, 19:41
por BlackZeroX
.::DoX::. escribió:
En tu función no agregas el caracter nulo al final de la cadena por lo que puede presentar fallas.
Imposible que ocurra, debido al memset() y que el algoritmo solo toca los caracteres nunca toca el ultimo (Solo menset lo toca).

Por otro lado:

* No hay nesesidad de usar memset... por logica se le van a setear a TODOS los valores.
* Personalmente prefiero que las funciones trabajen sin que ellas creen memoria (para eso mejor uso las clases).

Código: Seleccionar todo


char* reverse(char* szChars, size_t iSize) {
    size_t i = 0x0;
    if (iSize > 1 && szChars != NULL)
        for (;i < --iSize; i++) {
            szChars[i] ^= szChars[iSize];
            szChars[iSize] ^= szChars[i];
            szChars[i] ^= szChars[iSize];
        }
    return szChars;
}

inline char* strrev(char *szStr)
{
    return reverse(szStr, strlen(szStr));
}

int main(int argc, char * argv[])
{
    char szStr[] = "BlackZeroX";
    fprintf(stdout,"%s\n",strrev(szStr));
    return EXIT_SUCCESS;
}

Dulces Lunas1¡.