除“+”和“ - ”外,正确扫描字符

时间:2016-02-04 19:33:06

标签: c char scanf

我正在尝试扫描像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);

        }


}

2 个答案:

答案 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 charEOF。当值为负时,使用char调用它们是个问题。

答案 1 :(得分:1)

你错了:scanf() 正在扫描' +'和' - '。它只是将它们扫描为 后面的十进制数的一部分。

通过示例输入,程序首先扫描“' 4”,这是一个数字。然后它继续执行scanf(" %d",&n);,其扫描接下来的两个字符,#34; + 3",作为数字3,因为%d描述的字段可以选择性地具有前导符号字符,要么' - '或' +'。扫描在第一个' - '停止,因为十进制数字不能包含内部或尾部' - '实际上,' - '被扫描为下一个字符。你会看到不同的结果 - ' - '或' +'遵循两位数字或括号。

总的来说,您扫描数字的方法存在根本缺陷。它不仅在可选的符号字符上搁浅,而且当你想要读的数字的第二个最重要的数字是' 0时,我认为它无法做正确的事情。也就是说,你的方法无法区分" 401"来自" 41"。您无法成功地将数字的尾部扫描为数字,而不会丢失所需的信息。