This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Cygwin 1.7.1 sprintf() with format string having 8th bit set


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]