我正在尝试扫描像4+3-2*6*(3+4/2)#
我尝试的是遵循代码。它运行正常并且正确扫描每个字符,'+'
和'-'
除外。
为什么不扫描两个特定字符!
void scan(){
int n,tmp,digit_no;
char c;
scanf("%c",&c);
while(c!='#'){
if(isdigit(c))
{
tmp=c;
scanf(" %d",&n);
digit_no=numPlaces(n);
n=(tmp-48)*ipow(10,digit_no)+n;
push_n(n);
n=0;
}
else if(c=='+' || c=='-' || c=='*' || c=='/' || c=='(' || c==')' || c=='=' || c=='^')
push_o(c);
scanf("%c",&c);
}
}
答案 0 :(得分:2)
不要获得char
,测试数字,扫描int
,然后尝试将它们放在一起。由于"3-2"
,"1 23"
,"1+23"
之类的输入以及由@John Bollinger解释的scanf("%d",&n)
正在消耗,因此输入的代码失败了+ -
。
而是将数字放回stdin
,然后扫描int
。
if(isdigit(c)) {
ungetc(c, stdin);
scanf("%d",&n); // cannot fail as first character is a digit - may overflow though
push_n(n);
n=0;
}
还建议您检测EOF
并正确使用is...()
功能。
// char c;
// scanf("%c",&c);
int c;
// while(c!='#'){
while((c = fgetc(stdin)) !='#' && c != EOF) {
...
// scanf("%c",&c);
}
明细:is...()
预计int
范围为unsigned char
和EOF
。当值为负时,使用char
调用它们是个问题。
答案 1 :(得分:1)
你错了:scanf()
正在扫描' +'和' - '。它只是将它们扫描为 后面的十进制数的一部分。
通过示例输入,程序首先扫描“' 4”,这是一个数字。然后它继续执行scanf(" %d",&n);
,其扫描接下来的两个字符,#34; + 3",作为数字3,因为%d
描述的字段可以选择性地具有前导符号字符,要么' - '或' +'。扫描在第一个' - '停止,因为十进制数字不能包含内部或尾部' - '实际上,' - '被扫描为下一个字符。你会看到不同的结果 - ' - '或' +'遵循两位数字或括号。
总的来说,您扫描数字的方法存在根本缺陷。它不仅在可选的符号字符上搁浅,而且当你想要读的数字的第二个最重要的数字是' 0时,我认为它无法做正确的事情。也就是说,你的方法无法区分" 401"来自" 41"。您无法成功地将数字的尾部扫描为数字,而不会丢失所需的信息。