Post by Danivoid* cpySinEspacios( char* dest, size_t size_dest, const char* orig)
sería suficiente, ¿no?. La función ya modifica dest al pasarlo como
argumento.
Imagino que te referías a
void cpySinEspacios(char* dest, size_t size_dest, const char* orig)
y sin devolver ningún valor.
En este caso sí, puesto que no se hace ninguna comprobación ni se
devuelve ningún código de error. Puede haber dos razones para declararla
así (ojo, que voy a leer la mente del que escribió originalmente el
código):
- Por tradición; normalmente, las funciones de string.h devuelven un
puntero a la cadena destino.
- Por si acaso; quizá quieras devolver en algún momento NULL si se
produce un error.
Post by DaniY respecto a publicar el código, bueno, simplemente estoy empezando con
C, y de paso, para hacerlo más llevadero, empleando la librería ncurses.
El problema lo obtenía al utilizar formularios. Puedo definir los
campos como dinámicos, de tal modo que 'crezcan' hasta contener el
dato introducido. El tema es que inicialmente, debo definir el tamaño de
los campos (p.e. char[30]), con lo que si introduzco un dato de menor
tamaño la librería me lo rellena con espacios (hasta completar los 30
caracteres). Dado que dicho dato se inserta a través de una sentencia
SQL en una base de datos (Postgresql), me interesaba quitar esos
espacios en blanco.
Está bien que utilices ncurses y SQL si eso te hace que el aprendizaje
más llevadero; pero que no te distraigan, que el C ya es suficientemente
traicionero. Me refiero a que, quizá, te quedases mejor con los
conceptos si te concentras en el C y dejas las librerías y extensiones
para más adelante. Creo que centrándote más, podrías ir captando, por
ejemplo, el manejo de punteros.
Post by DaniResumiendo, que el tema de los punteros me parece tela marinera.
Ahora sí te lo parece. Pero te aseguro que un día te levantarás y, de
repente, lo verás todo mucho más claro. Y a partir de ahí, no habrá
puntero que se te resista ;-)
Post by DaniAhora, el siguiente paso será ver si acabo de comprender el concepto
de 'puntero a función'.
Es más fácil de lo que parece. Piensa que es una forma de meter en una
variable una función de forma que puedas aplicarla más tarde (por
ejemplo, para pasarla a una función.
Mira, por ejemplo, la función qsort. Bueno, no mires la declaración, que
puede liarte un poco; pero sería más o menos así:
void qsort(void *vector, size_t long_vector, size_t long_miembro,
funcion_t *compara);
Bien, la función qsort toma un vector que contiene long_vector
elementos, de long_miembro bytes cada uno; y los ordena.
Bien, pues además de eso, la función qsort toma como argumento el
puntero a función compara. En compara se pasa el nombre de una función
cuyo cometido será comparar los miembros, para que qsort pueda
ordenarlos.
Por ejemplo, podrías definir una función (no se define exactamente así,
pero para el ejemplo vale):
int compara_int(int *x, int *y) { return *x > *y; }
Y pasaselo a qsort:
qsort(vector, long_vector, long_miembro, compara_int);
Y entonces qsort utilizaría el argumento compara (que contendrá la
referencia a compara_int) para obtener la comparación entre elementos:
if (compara(vector + i, vector +j)) { /* ... */ }
Como el argumento compara ha almacenado la referencia a compara_int,
será como aplicar compara_int a los dos argumentos.
De esta forma, podrías ordenar en sentido contrario muy fácilmente, sólo
tendrías que definir la función compara_rev:
int compara_rev(int *x, int *y) { return *x < *y; }
Y pasárselo a qsort:
qsort(vector, long_vector, long_miembro, compara_rev);
Y ahora qsort ordenaría el vector en sentido inverso.
Bueno, creo que he acabado liándome yo sólo con tanto qsort y tanto
compara. Espero que te haya quedado un poco más claro.
Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>