primero (como siempre) Quiero pedir disculpas por mi inglés, puede que no sea lo suficientemente claro.Leyendo cadenas con longitud indefinida en C
No soy tan bueno en la programación C, y me pidieron que leyera una entrada de "cadena" con una longitud indefinida.
Esta es mi solución
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *newChar();
char *addChar(char *, char);
char *readLine(void);
int main() {
char *palabra;
palabra = newChar();
palabra = readLine();
printf("palabra=%s\n", palabra);
return 0;
}
char *newChar() {
char *list = (char *) malloc(0 * sizeof (char));
*list = '\0';
return list;
}
char *addChar(char *lst, char num) {
int largo = strlen(lst) + 1;
realloc(&lst, largo * sizeof (char));
*(lst + (largo - 1)) = num;
*(lst + largo) = '\0';
return lst;
}
char *readLine() {
char c;
char *palabra = newChar();
c = getchar();
while (c != '\n') {
if (c != '\n') {
palabra = addChar(palabra, c);
}
c = getchar();
}
return palabra;
}
Por favor, le agradecería que me ayudas por decirme si es una buena idea o darme alguna otra idea (y también me dice si es una "correcta" uso para punteros).
Gracias de antemano
EDIT: Bueno, gracias por vosotros respuestas, que eran muy útiles. Ahora publico el código editado (y espero que sea mejor), tal vez podría ser útil para alguien nuevo en C (como yo) y recibir retroalimentación de nuevo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reChar(char **, int *);
void readLine(char **, int *);
int main() {
char *palabra = NULL;
int largo = 0;
reChar(&palabra, &largo);
readLine(&palabra, &largo);
printf("palabra=%s\n", palabra, largo);
system("pause");
return 0;
}
void reChar(char **lst, int *largo) {
(*largo) += 4;
char *temp = (char*) realloc(*lst, (*largo) * sizeof (char));
if (temp != NULL) {
*lst = temp;
} else {
free(*lst);
puts("error (re)allocating memory");
exit(1);
}
}
void readLine(char **lst, int *largo) {
int c;
int pos = 0;
c = getchar();
while (c != '\n' && c != EOF) {
if ((pos + 1) % 4 == 0) {
reChar(lst, largo);
}
(*lst)[pos] =(char) c;
pos++;
c = getchar();
}
(*lst)[pos] = '\0';
}
PS:
Se parece suficiente para frenar aumentar tamaño de la "palabra".
no estoy seguro de si la captura
getchar()
en unint
y luego se echó en unchar
es la forma correcta de hadle EOF pitfall
'sizeof (char)' se garantiza que siempre es 1. Esto es menor en comparación con los comentarios válidos que puede encontrar en las respuestas. –
'int main()' no es una firma válida para main. Use 'int main (void)' o 'int main (int argc, char * argv [])'. – mk12