scanf校验3个int输入疑问:自动化测试是否存在无换行输入?
输入合法性校验问题解答
你的代码为啥处理1/2个值时没反应?
你说的“仅输入1或2个值时不会输出'n/a'”,核心原因是scanf在没读够指定格式的内容时,会一直阻塞等待输入。比如你输入“1”就停着不回车,程序会卡在读第二个%d的步骤,根本不会走到else分支输出错误。
另外你的代码还有两个坑:
- 要是输入3个整数后直接结束输入(没换行),最后那个
%c会读取失败,scanf返回3而不是4,结果被误判成非法输入 - 输入流里根本不会有
'\0',输入结束的标志是EOF,这个判断完全没用
修复后的校验代码
要准确校验“只能是3个整数,不能有多余内容”的需求,换这么写:
#include <ctype.h> // 要用到isspace函数 int x, y, z; // 先确保成功读到3个整数 if (scanf("%d%d%d", &x, &y, &z) != 3) { printf("n/a"); return 0; } // 检查后面有没有多余的非空白字符 char ch; // 跳过空格、制表符这些空白,读第一个非空白字符 if (scanf("%c", &ch) == 1 && !isspace(ch)) { printf("n/a"); return 0; } // 走到这说明输入合法
这段代码的逻辑:
- 先卡准必须读到3个整数,少一个都直接报错
- 跳过空白字符后,要是还有非空白内容,说明输入多了东西,直接报错
- 不管输入末尾是换行还是直接结束(比如自动化测试的无换行输入),都能正确识别
自动化测试的输入情况
自动化测试的输入不一定带换行符,常见的情况有:
- 带换行:比如输入串是
"1 2 3\n",模拟人工敲回车的场景 - 无换行:输入串就是
"1 2 3",输入流直接结束(比如从没有换行的文件里读取) - 带多余内容:比如
"1 2 3 4"、"1 2 3 abc",甚至是换行分隔的"1 2\n3" - 不完整输入:比如
"1"、"1 2",输入流提前结束
你的原始代码处理不了无换行的合法输入,这也是必须修复的问题。
内容的提问来源于stack exchange,提问作者forsenboylul
相关产品推荐
相关产品推荐

