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

#461
A ver, lástima que no haya nada como %m en windows pero se puede simular. La idea es ir adquiriendo trozos razonables de memoria con realloc, para no ir perdiendo tiempo en adquisición de memoria y copia.
En este caso se adquieren bloques de memoria de 10 bytes cada vez. Cuando se llena se adquieren 10 más de forma automática. Para el final de la adquisición de la cadena, marcado por el carácter '\n', de añade el carácter nulo '\0' para marcar el final de la cadena si hay espacio; si no añade un byte más exproceso para alojarlo.

Al final se genera una cadena dinámica del mismo tamaño que la adquirida por teclado y se le copiará el contenido. La cadena auxiliar, la utilizada para adquirir del teclado es destruida y se devuelve la cadena ajustada. Eso sí, hay que recordar destruirla cuando ya no se necesite. Se considera que un char es un byte.

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

char* string_input() {
   char *ret_val; // cadena que será devuelta
   char *str = NULL; // cadena auxiliar para conseguir datos del teclado
   char c;
   const unsigned chunk = 10; // tamaño de trozos de memoria en bytes o caracteres
   int i=0; // posición del cursor en str

   while((c=getchar())!='\n') { // adquisición por teclado
       if(i%chunk == 0) // si i ha alcanzado el máximo de memoria
           str=realloc(str, i+chunk); // añadirle más
       str[i] = c; // copiar el caracter adquirido a la cadena
       ++i; // avanzar el puntero en str
   }
   if(i%chunk == 0) // si i ha alcanzado el máximo de memoria
       str=realloc(str, i+1); // añadir un byte más a str
   str[i] = '\0'; // cerrar la cadena

   ret_val = malloc(strlen(str)+1); // dimensionar la cadena de regreso con el tamaño exacto
   strcpy(ret_val, str); // copiar la cadena

   free(str); // borrar la cadena auxiliar

   return ret_val; // devolver la cadena resultado
}

int main(void) {
   char *str;

   printf("> ");
   str = string_input();

   printf("%s", str);

   free(str);
}


#462
La cabecera precompilada, creo, te está fastidiando. Es verdad que son más rápidas a la hora de compilar pero no son tan dinámicas. Deberás borrar el archivo precompilado para que lo haga de nuevo y acepte el define.
#463
Antes de cualquier include. Esto sirve para modificar el comportamiento de las librerías y por tanto debe ir antes de que estás hagan su trabajo.
#464
Eso es que el compilador encuentra peligrosa strcat y te dice que puede provocar el desbordamiento del búffer, precisamente lo que queremos hacer. Para ello te pide que desactives los warnings

Escribe #define _CRT_SECURE_NO_WARNINGS como primera línea del programa para saltarte esa protección.
#465
No es error de tiempo de compilación, pero puede llevarte a errores en tiempo de compilación por buffer overflow. Una cadena bien construida podría permitir la ejecución de código arbitrario (supongo que te suena esto). Por lo normal, si se escribe una cadena lo suficientemente larga el S.O. generará una excepción  porqué se ha intentado escribir en un área no admitida de memoria.

Para ver los efectos del desbordamiento de buffer:
#include <stdio.h>
#include <string.h>

int i;

int main() {
    int a = 0;
    char b[] = "\0";
    int c = 0;

    for(i=0; i<10;++i) {
        strcat(b, "a");
        printf("b = %s\n", b);
        printf("a = %d\nc = %d\n\n", a, c);
    }
}
#466
No te lo va a arreglar pero hay un error bastante malo:
char entrada[] = "\0";
Hace que la cadena 'entrada' solo aloje espacio para un (1) único carácter. Cualquier adquisición de una cadena diferente provocará un desbordamiento pues al capturar una cadena de un (1) único carácter estarás guardado dos (2) el que te interesa seguido del carácter nulo ('\0').
#467
Son muchos conceptos así que ¿qué parte no entiendes?
¿Su concepto?
¿Los punteros?
¿Cómo se funcionan?
¿Cómo se desarrollan?

Lo digo porque sabes, a lo mejor, sabes que es una pila pero como fallas en punteros no ves como se desarrolla o sabes de punteros pero no ves diferencia entre pila y lista enlazada.
¿Qué te falla?
#468
Pon lo que llevas hecho.

Después verás que igual que la formas la escribes.
#469
No deberías escribir en argv, es para pasarle información al programa.
Cuando uses strcat, strcpy y toda esta lista de instrucciones asegúrate de que el destino tiene el tamaño suficiente como para alojar la cadena de origen.

Para tu caso lo mejor sería crear un búffer que pudiera alojar toda la cadena, algo así como
char buffer[255] = {0};
for (int i=1; i<argc; ++i)
   strcat(buffer, argv[i]);
#470
Has cambiado el while por el if?
Ya, y al pasarle con otra ventana por encima se queda dibujada el trazo de esa pantalla?