сначала (как всегда) Я хочу извиниться за мой английский, это может быть недостаточно ясно.
Я не очень хорош в программировании на C, и меня попросили прочитать «строковый» ввод с неопределенной длиной.
Это мое решение
#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;
}
Пожалуйста, я буду признателен, если вы поможете мне, сообщив мне, если это хорошая идея, или дайте мне какую-то другую идею (а также сообщите мне, если это «правильное» использование для указателей).
Заранее спасибо
РЕДАКТИРОВАТЬ: Ну, спасибо за ваши ответы, они были очень полезны.Теперь я публикую отредактированный (и я надеюсь, что лучше) код, может быть, он может быть полезен для новичка в C (как я) и получит обратную связь.
#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:
Кажется, достаточно замедлить увеличение размера "палабры".
Я не уверен, что захват getchar()
в int
, а затем приведение его в char
- правильный путь к ловушке EOF ловушка