Čitanje linije
Napisati funkciju ssize_t read_line(char **line, size_t *len) koja čita liniju nepoznate dužine.
Ulaz
Sa standardnog ulaza se unose linije porizvoljne dužine sve do kraja unosa.
Izlaz
Na standardni izlaz, za svaku liniju, ispisati dužinu linije i prvih
LEN:<len> TEXT:<line[1..30]>...
Ukoliko linija nema
Primer
Ulaz
For a moment, nothing happened. Then, after a second or so, nothing continued to happen.
Time is an illusion. Lunchtime doubly so.
Space is big. You just won't believe how vastly, hugely, mind-bogglingly big it is. I mean, you may think it's a long way down the road to the chemist's, but that's just peanuts to space.
Don't Panic.
Izlaz
LEN:88 TEXT:For a moment, nothing happened...
LEN:41 TEXT:Time is an illusion. Lunchtime...
LEN:187 TEXT:Space is big. You just won't b...
LEN:0 TEXT:
LEN:12 TEXT:Don't Panic.
Rešenje
main.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define INITIAL_SIZE 8
ssize_t read_line(char **lineptr, size_t *n)
{
if (*lineptr != NULL) {
free(*lineptr);
*lineptr = NULL;
}
*n = INITIAL_SIZE;
*lineptr = malloc(*n * sizeof(char));
if (*lineptr == NULL) {
return -1;
}
ssize_t pos = 0;
char c;
while ((c = getchar()) != EOF) {
if (pos + 1 >= *n) { // +1 for null terminator;
size_t new_size = *n * 2;
char *new_ptr = realloc(*lineptr, new_size * sizeof (char));
if (new_ptr == NULL) {
free(*lineptr);
return -1;
}
*lineptr = new_ptr;
*n = new_size;
}
(*lineptr)[pos++] = (char) c;
if (c == '\n') {
break;
}
}
if (pos == 0 && c == EOF) {
return -1;
}
(*lineptr)[pos] = '\0';
return pos;
}
int main(void)
{
char *line = NULL;
size_t len = 0;
ssize_t nread;
// while ((nread = getline(&line, &len, stdin)) != -1)
// getline is POSIX, we implement our own read_line
while ((nread = read_line(&line, &len)) != -1) {
printf("LEN:%zd TEXT:", nread - 1);
if (nread - 1 > 30) {
for (size_t i = 0; i < 30; i++) {
putchar(line[i]);
}
printf("...\n");
} else {
printf("%s\n", line);
}
}
return 0;
}