Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - rir3760

#1201
Dos comentarios en relaciona los programas de leosansan:

1) Se debe evitar el uso de la función "gets", el porque se explica en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

2) Es un error utilizar la función "scanf" en esta forma:
scanf("%s%c", cadena);
Ya que la cadena de formato "%s%c" indica que el carácter sera almacenado en la dirección en memoria indicada por el tercer argumento, el problema es que este no existe. En su lugar se debe pasar una dirección de memoria valida o bien utilizar "%*c" para indicar que el carácter sera descartado.

Un saludo
#1202
Cita de: yoxter en 28 Septiembre 2012, 00:54 AM
Saludos creo que esto lo que buscas

char *nombre;

/* ... */

scanf("%s", nombre);
No es valido. Toda variable local inicia con un valor no definido o "basura", antes de utilizar ese puntero se debe almacenar en el una dirección valida ya sea mediante el operador "&" (no necesario en el caso de arrays) o el valor de retorno de malloc/calloc/realloc.

Como ya se ha comentado en el tema C no tiene un tipo para cadenas, en su lugar estas se almacenan en array de caracteres.

Un saludo
#1203
Es una forma (en mi opinión enredada) de verificar los cuatro limites. Su base es utilizar el hecho que el operador "&&" es un operador de corto circuito, lo que ello significa es:

* Si el operando a la izquierda de "&&" es falso ("false" o bien el valor cero) ese es el resultado de la expresión y el operando de la derecha no se evalúa.

* Si el operando a la izquierda es verdadero el resultado del operador "&&" esta dado por la expresión a la derecha. En el caso de tu función ello se garantiza con la inicialización:
Código (cpp) [Seleccionar]
bool result = true;

Otra forma de verificar los cuatro limites sin el uso de la variable como tampoco asignaciones repetidas (en buen cristiano con el mismo efecto) es:
Código (cpp) [Seleccionar]
bool Contains(const b2AABB& aabb) const
{
   return lowerBound.x <= aabb.lowerBound.x
      && lowerBound.y <= aabb.lowerBound.y
      && aabb.upperBound.x <= upperBound.x
      && aabb.upperBound.y <= upperBound.y;
}


Un saludo
#1204
No. En C y C++ (en este ultimo exceptuando las referencias) todo se pasa por valor salvo los arrays. Con estos lo que se pasa es la dirección del primer elemento.

Y las funciones declaradas en cualquiera de estas dos formas:
int fn(char a[]);
int fn(char a[N]);

En realidad se procesan de así:
int fn(char *a);

Un saludo
#1205
Programación C/C++ / Re: substring en array char
22 Septiembre 2012, 00:33 AM
No es necesario copiar la cadena en un array auxiliar. En su lugar puedes utilizar "strstr" para buscar la subcadena, si se encuentra utilizas "strchr" para buscar el carácter '\n' después de esta.

Tu programa con esas modificaciones:
#include <stdio.h>
#include <string.h>

int main(void)
{
   char *cadena = "aaaa\nbbbb\nccccc1\ndddddd\nccccc2\nffff\nccccc3";
   char *buscar = "ccc";
   size_t nc_buscar = strlen(buscar);
   char *p;
   char *q;
   
   p = cadena;
   while ((p = strstr(p, buscar)) != NULL){
      if ((q = strchr(p + nc_buscar, '\n')) != NULL){
         printf("%.*s\n", q - p, p);
         p = q + 1;
      }else {
         printf("%s\n", p);
         break;
      }
   }
   
   return 0;
}


Un saludo
#1206
Programación C/C++ / Re: substring en array char
21 Septiembre 2012, 17:57 PM
Cita de: xiruko en 21 Septiembre 2012, 17:28 PMhe probado tu funcion y no me iba, y creo que es porque aunque aumentes el puntero sumandole la longitud de la cadena, luego a la funcion strstr() le vuelves a pasar la cadena original "cad", por lo que el programa entra en un bucle infinito.
Ouch! Cierto, eso pasa por verificar los programas "en la cabeza". La corrección es como indicas.

Pensándolo un poco no es necesaria una variable local (el puntero "p") ya que se puede utilizar el primer parámetro acortando la función a:
#include <string.h>

int num_reps(char const *p, char const *sub)
{
   size_t nc_sub = strlen(sub);
   int i;
   
   for (i = 0; (p = strstr(p, sub)) != NULL; i++)
      p += nc_sub;
   
   return i;
}


Un saludo (y gracias por la corrección)
#1207
Programación C/C++ / Re: Ayuda programa con ficheros
21 Septiembre 2012, 17:30 PM
Cita de: ankora45 en 20 Septiembre 2012, 17:58 PMya solo me tira una advertenci pero el compilador la ignora se puede compilar y funciona correctamente gracias +1 a los dos posteo codigo arreglado
Tu programa tiene varias deficiencias como el uso de "gets" y "fflush(stdin)", por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

El error principal continua, al llamar a la función "gets" utilizas:
char letra[1];

/* ... */

gets (letra);

/* ... */

if ((letra == 's') || (letra == 'S'))

Ello no es correcto por dos razones: solo se puede almacenar un carácter en el array "letra" (ahí el programa puede reventar) y cuando realizas la comparación no tratas con un carácter sino con una dirección de memoria (donde se almacena el array).

Para que funcione correctamente debería ser mas o menos así:
char letra[2];

/* ... */

gets (letra);

/* ... */

if ((letra[0] == 's') || (letra[0] == 'S'))

Pero debido al uso de "gets" sigue la posibilidad de que el programa reviente (mejor usar "fgets", ello se indica en el tema que mencione).

Un saludo
#1208
Programación C/C++ / Re: substring en array char
21 Septiembre 2012, 17:13 PM
Hay un error en esa función: el utilizar el operador "++" en la condición tiene como efecto que la variable "i", en el cuerpo del bucle, sea el indice del siguiente carácter.


Otra forma es utilizando la función "strstr", por ejemplo:
#include <string.h>

int num_reps(char const *cad, char const *sub)
{
   size_t nc_sub = strlen(sub);
   int i;
   char *p;
   
   for (i = 0; (p = strstr(cad, sub)) != NULL; i++)
      p += nc_sub;
   
   return i;
}


Un saludo
#1209
Cita de: CSQCasimiro en  9 Septiembre 2012, 03:23 AMgracias, era eso :D, lo de la función es lo de menos ,el aviso era por que mandaba un parámetro sin inicializar , pero no hacia falta por que lo sobrescribía mas tarde con malloc
Lo primero que haces con "registro" es asignarle un valor, por ello no debería ser un parámetro sino una variable local.

Si apenas empiezas lo mejor es utilizar el compilador en el modo mas estricto posible.

Un saludo
#1210
Programación C/C++ / Re: eliminar vocales
6 Septiembre 2012, 19:14 PM
Cita de: ALONSOQ en  6 Septiembre 2012, 17:09 PMHola estoy haciendo un programa que invierta una cadena y elimie las vocales.
Lo primero que debes aclarar es a que te refieres con eliminar las vocales ya que en tu programa solo las sustituyes por un espacio.

Si la idea es no imprimirlas una forma es, utilizando la función "strchr" (prototipo en <string.h>):
void invertir(char cad[])
{
   size_t i;
   
   i = strlen(cad);
   while (i > 0)
      if (strchr("AEIOUaeiou", cad[--i]) == NULL)
         putchar(cad[i]);
   putchar('\n');
}


Un saludo