La idea del static es que el dato se mantenga de llamada a llamada pero solo sea accesible para esa función. Si sabes que debes usar ese dato fuera de la función hazlo global.
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úwhile(getchar() != '\n');
después del scanf.#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void crear_lista(char ***lista, const char *origen) {
char *palabra;
char **l;
char *delimitadores = " \t";
char *copia;
unsigned i = 0;
// Guarda para saber si origen está vacío.
if(origen == NULL) {
*lista = NULL;
return;
}
// Una copia no constante de origen para strtok
copia = malloc((strlen(origen) + 1) * sizeof(char));
strcpy(copia, origen);
// Se saca la primera palabra de origen
palabra = strtok(copia, delimitadores);
// Se genera espacio para guardar un elemento en la lista
l = malloc(sizeof(char *));
// Se genera espacio para guardar la primera palabra...
l[i] = malloc((strlen(palabra)+1) * sizeof(char));
// y se guarda
strcpy(l[i], palabra);
// Se avanza el puntero de la lista en una posición
++i;
// Mientras queden palabas en origen
while((palabra = strtok(NULL, delimitadores))) {
// Se repiten los pasos anteriores. El uso de realloc
// es por que se redimensiona la lista.
l = realloc(l, sizeof(char *) * i+1);
l[i] = malloc((strlen(palabra)+1) * sizeof(char));
strcpy(l[i], palabra);
++i;
}
// Se libera la variable copia.
free(copia);
// Para terminar una última redimensión...
l = realloc(l, sizeof(char *) * i+1);
// para alojar el valor nulo que marca el fin de la lista.
l[i] = NULL;
// Se guarda la lista en la variable del parámetro de la función.
*lista = l;
}
void liberar_lista(char ***lista) {
int i;
// Si no hay nada que liberar regresa.
if(!*lista) return;
// Por cada elemento en la lista...
for(i = 0; lista[i]; ++i)
// liberar esa posición.
free((*lista)[i]);
// Se libera la lista.
free(*lista);
// Se marca nula la lista en la variable
// del parámetro de la función y así indicar
// que dicha variable está libre para usarse
// de nuevo.
*lista = NULL;
}
int main() {
const char *s = "cadena_uno cadena_dos cadena_tres cadena_cuatro cadena_cinco";
char **ss;
int i;
crear_lista(&ss, s);
for(i = 0; ss[i]; ++i)
printf("%s\n", ss[i]);
liberar_lista(&ss);
}
#include <stdio.h>
#include <time.h>
enum {
TIMEOUT_RUNNING,
TIMEOUT_DONE,
TIMEOUT_ERROR = -1
};
int timeout(unsigned segundos) {
static time_t t;
static unsigned s;
if(segundos) {
time(&t);
s = segundos;
}
if(!s)
return TIMEOUT_ERROR;
if(difftime(time(NULL), t) >= s) {
s = 0;
return TIMEOUT_DONE;
}
return TIMEOUT_RUNNING;
}
int main() {
int i = 0;
if(timeout(1) == TIMEOUT_ERROR)
return 1;
while(i < 5) {
printf("%i seg\r", i);
fflush(stdout);
if(timeout(0) == TIMEOUT_DONE) {
timeout(1);
++i;
}
}
}