有人可以解释这个scanf代码的含义[关闭]

问题描述 投票:-7回答:1

我试图理解这个代码,用于计算第一个和后面的语法集。在这个scanf已被用于多个输入

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

其中a是2D数组,ch是char。有人能解释一下这条线的含义吗?

c input compiler-construction scanf
1个回答
2
投票

正如在评论中所说,scanf("%s%c",a[i],&ch);尝试在a[i]中读取一个'word'作为字符串,并在ch中读取一个字符串

因为'word'以分隔符结束,并且%s和%c之间没有空格如果读取字符以设置ch该字符是第一个分隔符

示例:

#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”之后的第一个空格

当然是在azeenter的情况下

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

ch得到换行符


不冒险写出字符串的正确方法是设置最大字符数,在我的例子中,scanf("%9s%c", s, &ch)(9而不是10,以便为空字符结束字符串的位置)

如果可用的'单词'至少有10个字符,则第10个字符将由ch得到:

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

© www.soinside.com 2019 - 2024. All rights reserved.