[Solved] Can someone explain the meaning of this scanf code [closed]


As said in remarks scanf("%s%c",a[i],&ch); try to read a ‘word’ as a string in a[i] and a char in ch

Because a ‘word’ is ended by a separator and there is no space between %s and %c if a character is read to set ch that character is the first separator

Example :

#include <stdio.h>

int main()
{
  char s[10], ch;
  printf("%d\n", scanf("%s%c", s, &ch));
  printf("'%s' '%c' (%d)\n", s, ch, ch);
}

Compilation and execution:

pi@raspberrypi:/tmp $ gcc s.c
pi@raspberrypi:/tmp $ ./a.out
aze q
2
'aze' ' ' (32)

so ch does not get q but the first space after “aze”

Of course in the case of azeenter

pi@raspberrypi:/tmp $ ./a.out
aze
2
'aze' '
' (10)

ch get newline


The proper way to not take the risk to write out of the string is to set the max number of characters, in my example above scanf("%9s%c", s, &ch) (9 rather than 10 to have the place for the null character ending the string)

If the available ‘word’ has at least 10 characters the 10nth will be get by ch :

pi@raspberrypi:/tmp $ gcc s.c
pi@raspberrypi:/tmp $ ./a.out
1234567890
2
'123456789' '0' (48)

Adding a space between %s and %c changes the behavior because the separators are skip between the ‘word’ and the returned character, example :

#include <stdio.h>

int main()
{
  char s[10], ch;
  printf("%d\n", scanf("%9s %c", s, &ch));
  printf("'%s' '%c' (%d)\n", s, ch, ch);
}

Compilation and execution:

pi@raspberrypi:/tmp $ gcc s.c
pi@raspberrypi:/tmp $ ./a.out
aze    q
2
'aze' 'q' (113)

so that time ch gets q

solved Can someone explain the meaning of this scanf code [closed]