Strings can point anywhere in the malloc'ed region:
char buffer[] = "railroad";
char *s = buffer;
char *t = buffer + 4;
printf("mult: %ld\n", strlen(s) * strlen(t));
Suppose I read 100 bytes, formatted as "{name}\t{rank}\t{serial number}\t" using variable length parts.
I can read the data into a single string buffer, replace the commas with NULs, and set up strings pointing to the middle of the buffer;
typedef struct {char buf[101], char *name, char *rank, char *serialno} person;
/* 100 bytes formatted as: name\trank\tserial no\t. */
int read_data(FILE *f, person *p) {
char *s;
if (fread(p->buf, 1, 100, f) != 100) return -1;
p->buf[100] = 0;
p->name = p->buf;
if ((s = strchr(p->buf, '\t') == NULL) return -2;
*s = 0;
p->rank = s+1;
if ((s = strchr(s+1, '\t') == NULL)) return -2;
*s = 0;
p->serialno = s+1;
if ((s = strchr(s+1, '\t') == NULL)) return -2;
*s = 0;
return 0;
}
person subject;
if (read_data(stdin, &subject)) fail("cannot read.");
print("Hello %s %s.\n", subject.rank, subject.name);
...
Even better, the protocol might have NUL characters already in the code, expecting C strings to point to the correct start.