Buenas!! tengo un calentamiento de cabeza enorme porque no consigo hacer que al escribir una palabra como "Hooola" o "Muuuuchos" que me reduzca las letras a 1 y salga "Hola" y "Muchos", ¿como lo hago? lo he intentado hacer con subprogramas y tal, pero no se si hay alguna manera mas sencilla.

Gracias y un saludo!
Bueno a ver...

Código: Seleccionar todo

#include <iostream>
using namespace std;


char *acortar(char *str)
{
  //linkgl was here
  char temp; //caracter siguiente
  char *salida; //cadena de salida
  int i,c=0; //contadores
  salida=(char *)malloc(strlen(str)); //reservamos x bytes y los limpiamos
  memset(salida,0,strlen(str));
  for(i=0;i<strlen(str);i++)
  {
    temp=str[i+1];
    if(temp!=str[i]) //si el caracter que sigue de i es idéntico al actual se suprime
    {
      salida[c]=str[i];
      c++; //incrementa el contador para concactenar en salida
     }
  }
  return salida;
}

int main()
{
  cout << acortar("hooola")<<endl;
  cin.get();
  return 0;
}
Me faltó liberar la memoria de salida, pero dentro de lo que cabe en tu pedido funciona me parece xD
//mHmm..
@linkgl, la solución en buena medida funciona. Ahora deberían controlarse situaciones como las producidas por una palabra como "carrooo" refiriéndose a la palabra original como "carro" y el resultado que sabemos dará es "caro".
Y la memoria salidas supongo te refieres a:

char resultado[10];
resultado = acortar("hooola");
free(resultado);

Un saludo ;)
En tu ventana
Y en tu ventana, gritas al cielo pero lo dices callada..
The Swash escribió:@linkgl, la solución en buena medida funciona. Ahora deberían controlarse situaciones como las producidas por una palabra como "carrooo" refiriéndose a la palabra original como "carro" y el resultado que sabemos dará es "caro".
Y la memoria salidas supongo te refieres a:

char resultado[10];
resultado = acortar("hooola");
free(resultado);

Un saludo ;)
O usamos un diccionario que no me gustaría o aplicamos las leyes de la gramática el problema son las excepciones xD siempre las hay...

Y sí a eso me refiero porque reservé un espacio de memoria con malloc pero no se puede liberar tan fácilmente puesto que no es una variable global y si la libero en la función no la puedo retornar, se podría crear una variable global y trabajar con ella todo el programa
//mHmm..
Si van a usar C++ haganlo usando TODA su potencia...

Código: Seleccionar todo


#include <iostream>
#include <algorithm>

using namespace std;

bool chackCharEqual(char now) {
    static char last = '\0';
    bool ret = static_cast<bool>(last == now);
    last = now;
    return ret;
}

inline string &acortar(string &text) {
    string::iterator newEnd = remove_if(text.begin(), text.end(), chackCharEqual);
    text.resize(newEnd - text.begin());
    chackCharEqual('\0');   //  Reset static var.
    return text;
}

int main()
{
    string text;
    getline(cin, text);
    cout << acortar(text) << endl;
    cin.get();
    return EXIT_SUCCESS;
}


Si van a usar estas dos llamadas malloc() y memset() entonces es mejor usar calloc()...

es decir...

Código: Seleccionar todo


  salida=(char *)malloc(strlen(str)); //reservamos x bytes y los limpiamos
  memset(salida,0,strlen(str));

Código: Seleccionar todo


  salida = static_cast<char*>calloc(strlen(str) + 1, 1); // solo usen static_cast si están en C++ de lo contrario usen el cast de C-ANSI...

Dulces Lunas!¡.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
linkgl escribió: Y sí a eso me refiero porque reservé un espacio de memoria con malloc pero no se puede liberar tan fácilmente puesto que no es una variable global y si la libero en la función no la puedo retornar, se podría crear una variable global y trabajar con ella todo el programa
Te equivocas, al igual que malloc, realloc y calloc son funciones y sin mencionar a new se pueden todas estas liberar el espacio de memoria que reservaron, sin importar que se retorne por una función después de su llamada, es decir no es necesaria una variable global en ningún caso ya que estas juegan otro papel:

Código: Seleccionar todo


...
    char *cadena = NULL;
    cadena = acortar(char *str)
    cout << cadena << endl;
    free(cadena); // delete[] cadena; <- En dado caso que se hallar realizado con new...
....

Otra manera de hacerlo seria esta (la función acortar solo nos retorna el punto final de la cadena, de esta manera podemos hacer la redimencion del bloque de memoria)...

Código: Seleccionar todo


#include <iostream>
using namespace std;

/***
    acorta la cadena
    Retorna el nuevo punto final de la cadena...
***/
const char *acortar(char *str)
{
    char last = '\0';
    while (*str) {
        if (last == *str) {
            for (register int i = 0; str[i] != '\0'; ++i) { //  se puede usar memcpy()...
                str[i] = str[i + 1];
            }
        } else {
            last = *(str++);
        }
    }
    return str; //  Retornamos el nuevo final de la cadena
}

int main()
{
    char text[256] = "CREAADDOOOO     PPPOOORRRRR     Miiiiiiiiiiguuuuuel AAAAAAnggggggel OOOOrtegaaaa Aviillllaaaa";
    acortar(text);
    cout << text <<endl;
    cin.get();
    return 0;
}

Dulces Lunas!¡.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
Te equivocas, al igual que malloc, realloc y calloc son funciones y sin mencionar a new se pueden todas estas liberar el espacio de memoria que reservaron, sin importar que se retorne por una función después de su llamada, es decir no es necesaria una variable global en ningún caso ya que estas juegan otro papel:
No me refería a que malloc era una variable global si eso fue lo que me entendiste, me refiero a que le reservé unos bytes a cierta variable local usando malloc en la función, de manera que, al retornar la variable no puedo liberarla simplemente haciendo free(var);
//mHmm..
cilofrapez escribió:Creo que os complicáis demasiado x)

Código: Seleccionar todo

const char* limpiar(char* cadena)
{
	int antes = 0;
	int despues = 1;
	
	while (cadena[antes] != '\0')
	{
		if(cadena[despues] == cadena[antes])
			despues++;
		else
			cadena[++antes] = cadena[despues++];
	}
	cadena[++despues] = '\0';
	return cadena;
}
EDIT: Pequeña correccion, que al estar pendiente de moderación no la he podido ahcer antes u_u
Responder

Volver a “C/C++”