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

Reply via email to