scanf dynamic allocation
%m is a POSIX extension, which may be why it's not available in Pelles C.
There is an example in the man page for scanf/sscanf (page 3, from line 270-290) that states the following:
EXAMPLE
To use the dynamic allocation conversion specifier, specify m as a length modifier (thus %ms or %m[range]). The caller must free(3) the returned string, as in the following example:
char *p; int n; errno = 0; n = scanf("%m[a-z]", &p); if (n == 1) { printf("read: %s\n", p); free(p); } else if (errno != 0) { perror("scanf"); } else { fprintf(stderr, "No matching characters\n"); }
As shown in the above example, it is necessary to call free(3) only if the scanf() call successfully read a string.
Source: SCANF(3) - Linux Programmer's Manual - GNU - 2013-01-30
I am not seeing %m
in section 7.21.6.2 of the Draft C11 standard (the section on fscanf
). I suggest that you avoid it and call malloc()
as you would in C99.