This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Re: Cygwin 1.7.1 sprintf() with format string having 8th bit set
- From: Andy Koppe <andy dot koppe at gmail dot com>
- To: cygwin at cygwin dot com
- Date: Mon, 4 Jan 2010 12:29:13 +0000
- Subject: Re: Cygwin 1.7.1 sprintf() with format string having 8th bit set
- References: <2ECEEFBE44B2488C840CA73169D69A6D@LeakyCauldron>
2010/1/4 Joseph Quinsey
> In Cygwin 1,7.1, sprintf() with the format string having an 8th bit set
> appears to be broken. Sample code (where I've indicated the backslashes in
> the comments, in case they are stripped out by the mailer):
>
> #include <stdio.h>
>
> int main (void)
> {
> Â Âunsigned char foo[30] = "";
> Â Âunsigned char bar[30] = "";
> Â Âunsigned char xxx[30] = "";
>  Âsprintf (foo, "\100%s", "ABCD"); /* this is backslash one zero zero  */
> Â Âsprintf (bar, "\300%s", "ABCD"); /* this is backslash three zero zero */
> Â Âsprintf (xxx, "\300ABCD"); Â Â Â /* this is backslash three zero zero */
> Â Âprintf ("%d %d %d %d %d\n", foo[0],foo[1],foo[2],foo[3],foo[4]);
> Â Âprintf ("%d %d %d %d %d\n", bar[0],bar[1],bar[2],bar[3],bar[4]);
> Â Âprintf ("%d %d %d %d %d\n", xxx[0],xxx[1],xxx[2],xxx[3],xxx[4]);
> Â Âreturn 0;
> }
>
> gives:
>
> 64 65 66 67 68
> 0 0 0 0 0
> 192 65 66 67 68
>
> The second line of the output should be the same as the third.
The issue here is that the character set of the "C" locale in Cygwin
1.7 is UTF-8 and that the \300 on its own is an invalid UTF-8 byte. To
get well-defined behaviour, you need to invoke setlocale(LC_CTYPE,
...) with the approriate locale.
See the thread at http://cygwin.com/ml/cygwin/2009-12/msg00980.html
for more on this.
Andy
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple