You are misusing scanf_s()
. Microsoft compilers may warn you to use their secure extensions (aka c11 annex k). But, be careful if you do so. scanf_s()
is not a direct replacement for scanf()
.
In this case you have to pass the size of the output buffer as an extra argument.
char c;
scanf_s("%c", &c, 1);
Having to put a 1 as the size of a single character may seem a bit pedantic. That’s because %c
can read any number of character. %c
is just an alias for %1c
(a single character).
By knowing the buffer size scanf_s()
is designed to prevent buffer overflow (a security risk).
Although, how much these functions really help is debatable. See: Field Experience With Annex K.
Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size
to be specified for all input parameters of type c, C, s, S, or string
control sets that are enclosed in []. The buffer size in characters is
passed as an additional parameter immediately following the pointer to
the buffer or variable.…
In the case of characters, a single character may be read as follows:
char c;
scanf_s(“%c”, &c, 1);