elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Java [Guía] Patrones de diseño - Parte 1


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 112
21  Programación / Programación C/C++ / Re: C - Problema con scanf y string en: 15 Abril 2018, 21:22
Cambia lo de setbuf(stdin, NULL); por while(getchar()!='\n'); tal que así:
Código
  1. void getRangedSimStr(char* vec,char message[],char eMessage[],int minChars, int maxChars)
  2. {
  3.    char palabra[1000];
  4.    printf("%s", message);
  5.    scanf("%s",palabra);
  6.    while(getchar()!='\n');
  7.    while(strlen(palabra) > maxChars || strlen(palabra) < minChars)
  8.    {
  9.        printf("%s",eMessage);
  10.        scanf("%s",palabra);
  11.        while(getchar()!='\n');
  12.    }
  13.    strcpy(vec,  palabra);
  14. }
stdin, stdout y stderr todo y que son tratados como archivos no lo son, y por esa razón tienen sus manías.
22  Programación / Programación C/C++ / Re: ayuda para keylogger en: 15 Abril 2018, 11:28
Todo código debe estar dentro de una función.
23  Programación / Programación C/C++ / Re: ayuda con las cadenas en: 14 Abril 2018, 21:58
Hazte tu propia strcpy
Código
  1. char* strcpy(char *destino, const char* origen) {
  2.    register unsigned long long i = 0;
  3.    register char c;
  4.  
  5.    for(i=0; (c=origen[i]) != '\0'; ++i)
  6.        destino[i] = c;
  7.  
  8.    destino[i] = '\0';
  9.  
  10.    return destino;
  11. }

Como la original, ésta no tiene protección contra desbordamiento de buffer.
24  Programación / Programación C/C++ / Re: Consulta sobre programa C en: 14 Abril 2018, 19:39
Es 'muy imporante' tabular bien un código, lenguajes como Python lo han hecho norma, así se puede ver bien la estructura del programa. En cambio cuando se hace mal es fácil perder qué cosa va con qué cosa y así es imposible mantener la estructura.

Como podrás ver en el código arreglado cuándo entras en un periodo y preguntas por un pintor, el código debe seguir en ese if, no hay que cerrarlo, pues todo lo referente a esos pintores pertenece a ese periodo. Una vez terminado el periodo se sigue el else if para los periodos posteriores.

De todas formas esto es una práctica un poco mala, llamada spaghetti code, porque se extiende de seguido de principio a fin, haciéndolo difícil de seguir y mantener.

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4.  
  5. int main() {
  6.    char periodo[50];
  7.    char pintor[50];
  8.    char nacion[50];
  9.  
  10.    printf("Ingrese periodo: ");
  11.    scanf("%s", periodo); while(getchar()!='\n');
  12.  
  13.    if ((strcmp (periodo, "Prehistorico")==0) || (strcmp(periodo, "egipcio")==0)) {
  14.        printf("Galeria 1 \n");
  15.    }
  16.    else if (strcmp(periodo, "renacimiento")==0) {
  17.        printf("Ingrese nombre del pintor: ");
  18.        scanf("%s", pintor); while(getchar()!='\n');
  19.  
  20.        if ((strcmp (pintor, "Leonardo")==0) || (strcmp(pintor, "Michelangelo")==0)) {
  21.            printf ("Galeria 2 \n");
  22.        }
  23.        else if (strcmp(pintor, "Rafael")==0) {
  24.            printf ("Galeria 3");
  25.        }  
  26.        else if ((strcmp (pintor, "Tiziano")==0) || (strcmp(pintor, "Boticelli")==0)) {
  27.            printf("Galeria 4");
  28.        }  
  29.        else if ((strcmp (pintor, "Greco")==0) || (strcmp(pintor, "Tintoretto")==0)) {
  30.            printf("Galeria 5a");
  31.        }
  32.        else if (strcmp(pintor, "Bellini")==0) {
  33.            printf("Galeria 5b");
  34.        }
  35.        else {
  36.            printf("No hay obras de este pintor \n");
  37.        }
  38.    }
  39.    else if (strcmp(periodo, "barroco")==0) {
  40.        printf("Ingrese nacion: ");
  41.        scanf("%s", nacion); while(getchar()!='\n');
  42.  
  43.        if (strcmp (nacion, "Espana")==0) {
  44.            printf("Galeria 6, Velzaquez y Murillo");
  45.        }
  46.        else if (strcmp(nacion, "Italia")==0) {
  47.            printf("Galeria 7, Caravaggio");
  48.        }
  49.        else {
  50.            printf("No hay obras de esta nacionalidad");
  51.        }
  52.    }
  53.    else if (strcmp(periodo, "expresionismo")==0) {
  54.        printf("Galeria 8, Kandiski");
  55.    }      
  56.    else if (strcmp(periodo, "impresionismo")==0) {
  57.        printf("Galeria 8, Van Gogh");
  58.    }
  59.    else if (strcmp(periodo, "fauvismo")==0) {
  60.        printf("Galeria 8, Manguin");
  61.    }
  62.    else if (strcmp(periodo, "cubismo")==0) {
  63.        printf("Galeria 9, Picasso");
  64.    }
  65.    else if (strcmp(periodo, "surrealismo")==0) {
  66.        printf("Ingrese pintor: ");
  67.        scanf("%s", pintor); while(getchar()!='\n');
  68.  
  69.        if (strcmp(pintor, "Dali")==0) {
  70.            printf("Galeria 10");
  71.        }
  72.        else if (strcmp(pintor, "Miro")==0){
  73.            printf("Galeria 11");
  74.        }
  75.        else{
  76.            printf("No hay obras de este pintor");
  77.        }
  78.    }
  79.    else if ((strcmp(periodo, "informalismo")==0) || (strcmp(periodo, "hiperralismo")==0)) {
  80.        printf("Galeria 12");
  81.    }
  82.    else {
  83.        printf("No hay obras en este periodo");
  84.    }
  85.  
  86.    return 0;
  87. }
25  Programación / Programación C/C++ / Re: No me ejecuta el printf en: 13 Abril 2018, 18:23
 Correcto. El else que hay justo después hace que continúe la cadena de ifs en vez de iniciar una nueva toma de decisiones.
26  Programación / Programación C/C++ / Re: Estructura en: 13 Abril 2018, 07:09
Unas cuantas cosas mal pero la más importante
Si arreglo es una estructura después no la trates como un simple entero. Cómo arreglar eso: elimina la estructura y haz un array de ints ya que el programa está diseñado para ello, así ahorrarás tiempo.
27  Programación / Programación C/C++ / Re: No me ejecuta el printf en: 13 Abril 2018, 06:54
Haz un pantallazo de cuando te falla.
28  Programación / Programación C/C++ / Re: ordenar estructuras en c en: 12 Abril 2018, 13:50
Yo iniciaría con un int llamado comparación a 0.
Un if comparando las alturas: si p1 es mayor 'comparación' a -1, si p2 es mayor 'comparación' a 1.
Si los dos son iguales 'comparación' seguirá a 0.
El segundo if: si 'comparación' vale 0:
Comparar el nombre. Como antes.
Si los dos nombres son iguales 'comparación' seguirá a 0.
El tercer if: si 'comparación' vale 0:
Compara los apellidos....
Supongo que ya has pillado el algoritmo pues se repite para todas las decisiones.

Al final devuelves 'comparación'.
29  Programación / Programación C/C++ / Re: No devolver nunca punteros a variables locales a una función en c en: 11 Abril 2018, 16:08
Así es, dereferencias el puntero antes de devolverlo.
Pero lo dicho. Lo recibe un puntero así que a partir de ese momento estás apuntando a la dirección 9 de la memoria.
30  Programación / Programación C/C++ / Re: No devolver nunca punteros a variables locales a una función en c en: 11 Abril 2018, 09:41
Como te han dicho no has devuelto el puntero sino el valor al que apunta. Eso ha pasado por añadir el asterisco a la variable del return. Todavía tienes ahí lío con los operadores de punteros.

Ahora cuidado porque ese valor devuelto ha sido recogido por el puntero p de main y eso quiere decir que ahora apunta a la dirección 9. El programa ha funcionado porque en printf le has pedido la dirección a la que apunta, de haber querido acceder a su contenido el S.O. te habría detenido.

Respondiendo a tu pregunta: cuando se llama a una función previamente se forma un marco de esa función en la pila dónde se encuentran los argumentos, la dirección de retorno y todas las variables locales y el puntero de pila se mueve al final de todo. Cuando una función termina se devuelve el puntero de pila al inicio de todo eso, eso es al final de la función llamante, por esa razón esa memoria que hay después ya no es accesible.

Aunque eso último es mentira. Si devuelves un puntero a una variable local sigues apuntando en esa dirección de memoria que el sistema ya no puede tocar. Es posible y se te permite trabajar allí y mientras no llames a otra función esa memoria no se va a tocar y te parecerá válido lo que hagas. En el momento que llames a otra función harás que la pila aloje datos allí perdiendo todo loque hayas hecho.

Y sí, si me pasas ese puntero a la función puede corromperse a sí misma pues tendrá un puntero que apunta a una zona indeterminada de su marco.
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 112
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines