Hi Stephane,
On Mon, Jun 23, 2008 at 1:15 PM, Stephane Chazelas
<[EMAIL PROTECTED]> wrote:
> On Mon, Jun 23, 2008 at 12:37:50PM +0200, Michael Kerrisk wrote:
> [...]
>> NOTES
>> The GNU C library supports a non-standard extension that causes
>> the library to dynamically allocate a string of sufficient size
>> for input strings for the %s and %a[range] conversion
>> specifiers. To make use of this feature, specify a as a length
>> modifier (thus %as or %a[range]). The caller must free(3) the
>> returned string, as in the following example:
>>
>> char *p;
>>
>> scanf("%a[a-zA-Z]", &p);
>
> You need to check the return value of scanf (could be 0 or EOF,
> caused by the absence of letters in the input, or an EOF or read
> error or ENOMEM.
>
>> printf("%s0, p);
>
> typo? printf("%s\n", p)
Thanks for that. Forgot to double the slash in the source.
>> free(p);
>
> That might free something unallocated.
Good catch! Thanks.
>> This feature is not available if the program is compiled with
>> cc -std=cc99 or cc -D_ISOC99_SOURCE (unless _GNU_SOURCE is also
>> specified), in which case the a is interpreted as a specifier
>> for floating point numbers (see above).
>
> Maybe "gcc" instead of "cc" as I don't expect all the cc
> implementations to have such a -std option.
Done.
>> Since version 2.7, glibc also provides the m modifier for the
>> same purpose as the a modifier. The m modifier has the follow-
>> ing advantages:
>>
>> * It may also be applied to %c conversion specifiers (e.g.,
>> %3mc).
>>
>> * It avoids ambiguity with respect to the %a floating-point
>> conversion specifier (and is unaffected by cc -std=99 etc.)
>>
>> * It is specified in the upcoming revision of the POSIX.1 stan-
>> dard.
>
> Thanks for that, I hadn't thought of checking the draft.
I only though of it because for a long time I had a FIXME in the
scanf.3 page saying "Document the m modifier!"
> I can see the draft makes it clear that you don't need to free
> the buffer if scanf fails. I think it should be mentionned in
> the man page as well as it seems to also be the case for %a.
Yes, good idea.
> So:
>
> errno = 0;
> n = scanf(..., &p);
> if (n == 1) {
> printf("OK: %s\n", p);
> free(p);
> } else if (errno != 0) {
> perror("scanf");
> }
> else {
> fprintf(stderr, "expected letters, not \"%s\"\n", ...);
> }
Thanks for that piece of code. I'll include a version of that in the page.
Cheers,
Michael
--
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
man-pages online: http://www.kernel.org/doc/man-pages/online_pages.html
Found a bug? http://www.kernel.org/doc/man-pages/reporting_bugs.html
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]