有人可以解释一下这个scanf代码的含义吗

时间:2019-04-09 07:34:25

标签: c input compiler-construction scanf

我试图理解此代码,以便首先计算和遵循语法集。 在此scanf已用于多个输入

scanf("%s%c",a[i],&ch);

其中a是2D数组,ch是字符。有人可以解释这行的意思吗?

1 个答案:

答案 0 :(得分:2)

正如评论scanf("%s%c",a[i],&ch);所述,请尝试在a[i]中将'单词'读取为字符串,在 ch

中将其读取为字符

因为“单词”以分隔符结尾,并且如果读取字符以设置 ch <,则%s %c 之间没有空格。 / em>该字符是第一个分隔符

示例:

#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);
}

编译和执行:

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

所以 ch 不会得到 q ,而是“ aze”之后的第一个空格

当然,对于 aze enter

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

ch 获取换行符


不冒任何风险写出字符串的正确方法是设置最大字符数,在我的示例中,scanf("%9s%c", s, &ch)以上(9而不是10可以使空字符以空格结尾)字符串)

如果可用的“单词”至少包含10个字符,则通过 ch 获得第10个字符:

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

%s %c 之间添加空格会更改行为,因为在'word'和返回的字符之间会跳过分隔符,例如:

#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);
}

编译和执行:

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

以使时间 ch 获得 q