关于scanf()无法区分括号类型的原因及区分方法的咨询
问题原因分析
你的代码里scanf("( %d , %d )", &a, &b)的返回值只统计成功赋值的变量个数,而非整个格式字符串是否完全匹配。具体执行流程是:
- 匹配左括号
(,跳过空白后读取整数a; - 匹配逗号
,,跳过空白后读取整数b; - 尝试跳过空白后匹配右括号
)。
当输入(10, 15]时,a和b已经被成功赋值为10和15,此时scanf尝试匹配)时遇到],匹配失败,但返回值依然是2(因为两个变量都赋值成功了)。你的代码只判断ret != 2时报错,所以会误判为输入合法。
而输入(10, 15test时,若15后直接跟test,理论上ret也会是2,但可能你实际测试时的输入是(10, test15)这类情况(读取b时遇到非数字字符,导致ret=1),才会触发错误提示。
解决方法:确保括号匹配
要区分不同类型的括号,需要在验证变量赋值成功的基础上,额外确认结尾的括号确实是),常见的两种实现方式:
方法1:直接检查结尾括号
读取完a和b后,手动跳过空白字符,检查下一个非空白字符是否为):
#include <stdio.h> #include <stdlib.h> #include <ctype.h> // 用于isspace() int main(){ int a, b; int ret = scanf("( %d , %d", &a, &b); // 去掉格式串末尾的`)` if (ret != 2 ){ printf("Wrong input!\n"); return EXIT_FAILURE; } // 跳过所有空白字符 char c; while ((c = getchar()) != EOF && isspace(c)); // 检查是否是右括号 if (c != ')') { printf("Wrong input!\n"); return EXIT_FAILURE; } printf("Everything fine\n"); return EXIT_SUCCESS; }
方法2:检查输入是否完全匹配
保持原格式串,额外检查输入缓冲区是否还有非空白字符残留:
#include <stdio.h> #include <stdlib.h> #include <ctype.h> int main(){ int a, b; int ret = scanf("( %d , %d )", &a, &b); if (ret != 2 ){ printf("Wrong input!\n"); return EXIT_FAILURE; } // 检查是否还有非空白字符未处理 char c; while ((c = getchar()) != EOF && isspace(c)); if (c != EOF) { // 存在非空白字符,说明输入不合法 printf("Wrong input!\n"); return EXIT_FAILURE; } printf("Everything fine\n"); return EXIT_SUCCESS; }
这两种方式都能有效区分)和其他符号(比如]),确保输入完全符合预期格式。
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

