The title says it all. I'm using GCC 4.7.1 (bundled with CodeBlocks) and I faced a strange issue. Consider this:
int main() {
unsigned char a = 0, b = 0, c = 0;
scanf("%hhu", &a);
printf("a = %hhu, b = %hhu, c = %hhu\n", a, b, c);
scanf("%hhu", &b);
printf("a = %hhu, b = %hhu, c = %hhu\n", a, b, c);
scanf("%hhu", &c);
printf("a = %hhu, b = %hhu, c = %hhu\n", a, b, c);
return 0;
}
For inputs 1, 2 and 3, this outputs
a = 1, b = 0, c = 0
a = 0, b = 2, c = 0
a = 0, b = 0, c = 3
If I, however, declare a, b and c as global variables, it works as expected. Why is this happenning?
Thank you in advance
Other details:
I'm running Windows 8 64 bits. I also tried with -std=c99 and the problem persists.
Further research
Testing this code
void printArray(unsigned char *a, int n) {
while(n--)
printf("%hhu ", *(a++));
printf("\n");
}
int main() {
unsigned char array[8];
memset(array, 255, 8);
printArray(array, 8);
scanf("%hhu", array);
printArray(array, 8);
return 0;
}
shows that scanf is interpreting "%hhu" as "%u". It is directly ignoring the "hh". The output of the code with input 1 is:
255 255 255 255 255 255 255 255
1 0 0 0 255 255 255 255
The important detail is that you're using Windows, and presumably an outdated or non-conforming C environment (compiler and standard library). MSVCRT only supports C89 (and even then, not entirely correctly); in particular, there was no "hh" modifier in C89, and it's probably interpreting "hh" the same as "h" (i.e. short
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With