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 - MAFUS

#1071
Cometes bastantes fallos.

1. Tecla tiene un tamaño menor al que en verdad usa. Has reservado 5 bytes pero las cadenas tienen un byte más, el '\0' que marca el fin de cadena, por tanto deberías haber declarado tecla[6] o simplemente tecla[] pues si se define con una cadena C automáticamente reserva memoria.

2. Creas un array de chars con la intención de convertirlo en una cadena cuándo sólo quienes obtener un carácter.
Una cadena tiene, al menos 1 carácter, el nulo '\0' que marca fin de cadena.
Si tu intención es crear una cadena con 1 caracter válido debes reservar una memoria de 2 carácteres: uno para el carácter y otro para el carácter nulo.

3. Recoges una cadena de tamaño arbitrario mediante scanf("%s", vo);. Al hacer esto puedes cargar una cadena muy larga en vo y va a sobrepasar a la memoria que has pedido para la variable, por lo que se escribirá una parte de la memoria de la que no se tiene control. Puede pasar cualquier cosa, hasta que tu ordenador entre en internet, hackee un silo de misiles nucleares e inicie la tercera guerra mundial.
Para solventar eso haz que scanf tan solo tome 1 único carácter con scanf("%1s", vo);.

4. strcmp espera que se le pasen dos punteros que apunten a una cadena. Cuando tu pasas como argumento tecla[3] en realidad le estás pasando lo que hay en la cuarta posición de la cadena tecla, que es el caracter O. Como un carácter internamente es un valor numérico strcmp tomará ese valor numérico identificándolo como la dirección de inicio de una cadena. Seguro que el programa te va a fallar porqué el S.O. verá que esa posición de memoria no pertenece al segmento de tu programa y para evitar males mayores lo va a abortar.
#1072
Busca sobre el operador sizeof, es lo que necesitas.
#1073
La idea es:
i se mueve desde la primera fila hasta la última. Como se trata de una tabla cuadrada tabla[i][i] se mueve en la diagonal.
Ahora si se hace uso de j partiendo desde i - 1 hasta 0 y a cada paso se va sumando su posición anterior, se tiene que se rellena la tabla desde la diagonal hacia la izquierda de la forma deseada.
Lo mismo se hace después desde i + 1 hasta size - 1, que en código sería:for(j = i + 1; j < size; ++j) haciendo uso del algoritmo descrito anteriormente, con lo que se rellenará la tabla desde la diagonal hacia la derecha.
#1074
bucle j desde i - 1 hasta 0:
for( j = i-1; j >= 0; --j)
#1075
Te lo voy a dar en seudocódigo.
Un bucle que recorra las filas, índice i.
Un bucle que recorra las columnas de una forma especial, índice j.
Una variable llamada size guarda el tamaño del vector
Bucle i desde 0 hasta size - 1:
   tabla[i,i] = vector[i]
   var suma = vector[i]
   Bucle j desde i - 1 hasta 0
       suma = suma + vector[j]
       tabla[i,j] = suma
   suma = vector[i]
   Bucle j desde i + 1 hasta size - 1:
       suma = suma + vector[j]
       tabla[i,j] = suma

o usando triquiñuelas
Bucle i desde 0 hasta size - 1:
   tabla[i,i] = vector[i]
   var suma = vector[i]
   Bucle j desde i - 1 hasta 0
       suma = suma + vector[j]
       tabla[i,j] = suma
       tabla[j,i] = suma


Al terminar la tabla estará rellenada.
#1076
for(i=0; i<4; i++) {
    scanf("%i",&ed);
    if(ed>=18 && ed<=45) {
        cont++;
        scanf ("%i",&ed); // <-- Te sobra esta instrucción
    }
}


Cuando entres en el if al dar una edad que cumpla la condición, además de contabilizar, vas a pedir un dato que no se va a tener en cuenta porque al salir del if e iterar otra vez el bucle, vas a llegar al scanf del inicio que te machacará lo que hubiera puesto en el anterior en ed.

Si sigues el flujo del programa verás que el segundo scanf no tiene razón de ser. Sobra. Por eso te pedía datos de más.
#1077
La opción %m está incluida en el estándar POSIX.1-2008: http://pubs.opengroup.org/onlinepubs/9699919799/

Si se usa con %ms no recogerá toda la línea ya que el modificador %s se detiene en el primer carácter en blanco. Para ello se usa el %[^\n] que recoge toda la línea hasta el final o hasta encontrarse un carácter de nueva línea.

Como nota adicional el %*c al final de la cadena de control hace que se recoja el carácter de nueva línea pero no se asigne a ningún sitio, así se quita del buffer de entrada.
#1078
Como verás hace uso de argumentos no tan comunes en scanf, pero con ellos obtengo el dato que quiero y además me libero de \n en el buffer, todo en la misma línea.

#include <stdio.h>
#include <stdlib.h>

void limpiar( void ){
    system("cls||clear");
}

int main( void ){
    size_t tam_frases = 0, i;
    char **frases = NULL, salir;
   
    do {
        limpiar();
        frases = realloc(frases, (tam_frases + 1) * sizeof(char*));
        if(!frases) {
            fprintf(stderr, "\n\n *** Error al adquirir memoria ***\n\n");
            exit(1);
        }
       
        printf("\nIngrese frase....: ");
        scanf("%m[^\n]%*c", &frases[tam_frases]);
        ++tam_frases;
       
        printf("\nPara continuar \"S\" para finalizar \"N\"....: ");
        scanf("%c%*[^\n]%*c", &salir);
    } while(salir != 'n' && salir != 'N');
   
    printf ("\n Frases introducidas.....: ");
   
    for(i = 0; i < tam_frases; ++i)
        printf("\n>> %s", frases[i]);
   
    for(i = 0; i < tam_frases; ++i)
        free(frases[i]);
   
    return 0;
}
#1079
Un array de cadenas es fijo, no podrá crecer más si así lo necesita.

En unas horas te voy a pasar un código ejecutable que pone en práctica lo que te he dicho.
#1080
frases no es un array de cadenas, es solo una cadena, prueba de ello es su definición:
char *frases

para que sea un array dinámico de frases deberías hacer
char **frases

después a cada frase nueva haces crecer el puntero con calloc

char frases = calloc(frases, (tam_frases + 1) * sizeof(char*))

seguidamente cargas la nueva frase al array

scanf("%m[^\n]%*c", &frases[tam_frases]);

y actualizas tam_frases

++tam_frases

Para acabar acuérdate de liberar toda la memoria adquirida por scanf para cada cadena.
for(i = 0; i < tam_frases; ++i)
    free(cadena[i])