Поскольку вы выделяете достаточно места только для одного символа в этой строке:
line = malloc(sizeof(char));
И это заполняется \0
до вашего printf
заявления.
Полагаю, вы хотите изменить эту строку на:
/* Allocate enough room for 'lim' - 1 characters and a trailing \0 */
line = malloc(sizeof(char) * lim);
Или даже лучше:
char *line, *tmp;
tmp = line = malloc(sizeof(char) * lim);
А затем используйте tmp
во всей вашей математике указателя, таким образом line
все равно будет указывать на начало вашей строки.
И я знаю, что это в начале вашей разработки, но вы захотите убедиться, что вы free()
память, которую вы malloc()
.
Вот рабочая версия вашей функции, включая мои предлагаемые изменения:
#include <stdio.h>
#include <stdlib.h>
char *getline(int lim)
{
char c;
int i;
char *line, *tmp;
tmp = line = malloc(sizeof(char) * lim);
i = 0;
/* NOTE: 'i' is completely redundant as you can use 'tmp',
* 'line,' and 'lim' to determine if you are going to
* overflow your buffer */
while((c = getchar()) != '\n' && c != EOF && i < lim-1)
{
*tmp = c;
tmp++;
i++;
}
*tmp = '\0';
printf("%s", line);
return line;
}