【笔记】C语言的特殊输入问题

PTA 上问题碰到特殊输入问题,做个小的笔记。

L2-012 关于堆的判断 (25分) 这道题中,题目要求对给出的命题做判断,因为所给的命题是不确定的,无法在程序中直接使用scanf的格式化输入。最初通过cin >> string的方式读入数据,通过字符串解析、求子串取出数据,提交的代码出现运行时错误,之后是发现题目中说给的数据是包括负数的,包含负数对扣数字的操作又要麻烦不少。

后续通过scanf%*s格式读入数据,也就是针对这一部分数据我不需要提供变量去接收。举例说明:

5 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10

题目给的输入是这样的,我需要在命题中取出数字。其中有一条26 and 23 are siblings判断是否为兄弟结点的命题,在输入的第三部分包含数字,所以最开始先使用scanf("%d %s", &a, temp);接收,判断 temp 是否等于 and,如果是,则剩下的那部分,我可以直接使用scanf("%d %*s %*s", &b);去读入,并把需要的数读入变量 b;如果不是,则剩下的命题中,判断是否为根节点的命题还剩下两个字符串未被接收,所以要再次使用scanf("%*s %s", temp);读入数据并判断 temp 是否为 root,问题出在不是 root 的情况。

46 is the parent of 23
23 is a child of 10

针对这两条语句,还剩下 “of + 整型” 未被接收,因此我用了scanf("of %d", &b);去接收剩下的字符串,但是程序一直出现错误,错误在于of前还需要加一个 空格。但为什么需要再加空格,我重新研究了一下scanf格式化输入的用法。

int a, b;
scanf("%d%d", &a, &b);
scanf("%d %d", &a, &b);

上面两行代码其实是完全等价的,两个格式控制符之间如果没有空格,那么默认其存在一个空格。

但是实际上下面两行代码依旧是等价的:

scanf("%d%d", &a, &b);
scanf("%d    %d", &a, &b);

输入 3      4 和输入 3          4,a、b都能被赋值,所以两个格式控制符之间无论存在多少个空格均表示的是要分别读入两个数值,不管其中存在多少个空格,这点在输入时也是一样的。

而这种默认含有分隔,只对两个相邻格式控制符适用,如果是

scanf("z%d", &a);

则输入必须是z+整型,而如果是

scanf("z %d", &a);

其实也是不管 z 之后有多少个空格,a 都是可以被输入的,例如输入 z        250

因此,针对最上面提到的题目,使用 scanf("     of    %d", &b); 提交代码后结果也是正确的。那么,下回再遇到这类问题就尽情地打上空格吧 haha…

类型 合格的输入 参数类型
%a %A 读入一个浮点值(仅 C99 有效)。 float *
%c 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。 char *
%d 十进制整数:数字前面的 + 或 - 号是可选的。 int *
%e %E %f %F %g %G 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和 7.12e4 float *
%i 读入十进制,八进制,十六进制整数 。 int *
%o 八进制整数。 int *
%s 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 char *
%u 无符号的十进制整数。 unsigned int *
%x %X 十六进制整数。 int *
%p 读入一个指针 。
%[] 扫描字符集合 。
%% 读 % 符号。
发布了27 篇原创文章 · 获赞 0 · 访问量 87

猜你喜欢

转载自blog.csdn.net/charjindev/article/details/104312395
今日推荐