回 帖 发 新 帖 刷新版面

主题:calculator——“buf”: 未声明的标识符?

[code=c]
// calculator11.cpp : 定义控制台应用程序的入口点。


#include "stdafx.h"


#include <iostream>
#include<cstdlib>
#include<cctype>
using namespace std;

//函数声明
void eatspace(char *str);
double expr(char *str);
double term(char *str,int &index);
double number(char *str,int &index);

//定义常量
const int MAX=80;

int _tmain(int argc, _TCHAR* argv[])
{
    char [color=Red]buf[/color][MAX]={0};
    cout<<endl
        <<"Welcome to Calculator!"
        <<endl
        <<"Enter am expression, or an empty line to quit:"
        <<endl;
    
    for(;;){
        cin.getline(buf,sizeof buf);
        eatspace(buf);
        
        if(!buf[0])                  //如果字符串为空,则返回
           return 0;
        
        cout<<"\t="<<expr(buf)       //否则,输出表达式的值
            <<endl
            <<endl;
    }
    
    return 0;
}

//消除输入表达式的空格键
void eatspace(char *str)
{
    int i,j;
    for(i=0;i<MAX;i++){
        if(buf[i]!=' '){
            buf[j]=buf[i];
            j++;
        }
    }
    
    return;
}

//识别表达式函数,然后返回其值
double expr(char *str)
{
    double value=0.0;
    int index=0;
    
    value=term(str,index);
    
    for(;;){
        switch(buf[index])
        {
            case '\0':                  //当扫描到字符串最后一个字符时,返回其值
               return value;
            case '+' :
               value+=term(str,index);  //当扫描到‘+’字符时,则加上后面的乘除项
               break;
            case '-' :
               value-=term(str,index);  //当扫描到‘-’字符时,则减去后面的乘除项
               break;
            default  :
               cout<<endl
                   <<"There is a error!"
                   <<endl;
               exit(1);
        }
    }
}

//识别乘除项函数,然后返回其值
double term(char *str,int &index)
{
    double value=0.0;
    
    value=number(str,index);
    
    while(buf[index]='*'||buf[index]='/'){   //当扫描到‘*’或‘、’字符时,则乘以或除以后面的数字项
        if(buf[index]='*')
           value*=number(str,++index);
        if(buf[index]='/')
           value/=number(str,++index);
    }
    return value;
}

//识别数字项函数,然后返回其值
double number(char *str,int &index)
{
    double value=0.0;
    
    while(isdigit(buf[index])){              //如果是数字,那么循环扫描下一个字符
        value=10*value+(buf[index]-'0');
        index++;
    }
    
    if(buf[index]!='.')                      //如果不是小数点,那么返回此时的数字项
        return value;
        
    double factor=1.0;
    while(isdigit(buf[index++])){            //如果是小数点,那么循环扫描下一个字符
        factor*=0.1;
        value=value+factor*(buf[index]-'0');
    }
    return value;
}
[/code]
---------------------------------------------------------------------------------------------------------------------------------

1>------ 已启动生成: 项目: calculator11, 配置: Debug Win32 ------
1>生成启动时间为 2011/6/29 18:54:50。
1>PrepareForBuild:
1>  正在创建目录“c:\users\mstbiy\documents\visual studio 2010\Projects\calculator11\Debug\”。
1>InitializeBuildStatus:
1>  正在创建“Debug\calculator11.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
1>ClCompile:
1>  stdafx.cpp
1>  calculator11.cpp
1>c:\users\mstbiy\documents\visual studio 2010\projects\calculator11\calculator11\calculator11.cpp(47): error C2065: “buf”: 未声明的标识符
1>c:\users\mstbiy\documents\visual studio 2010\projects\calculator11\calculator11\calculator11.cpp(48): error C2065: “buf”: 未声明的标识符
1>c:\users\mstbiy\documents\visual studio 2010\projects\calculator11\calculator11\calculator11.cpp(48): error C2065: “buf”: 未声明的标识符
1>c:\users\mstbiy\documents\visual studio 2010\projects\calculator11\calculator11\calculator11.cpp(64): error C2065: “buf”: 未声明的标识符
1>c:\users\mstbiy\documents\visual studio 2010\projects\calculator11\calculator11\calculator11.cpp(89): error C2065: “buf”: 未声明的标识符
1>c:\users\mstbiy\documents\visual studio 2010\projects\calculator11\calculator11\calculator11.cpp(89): error C2065: “buf”: 未声明的标识符
1>c:\users\mstbiy\documents\visual studio 2010\projects\calculator11\calculator11\calculator11.cpp(89): fatal error C1903: 无法从以前的错误中恢复;正在停止编译
1>
1>生成失败。
1>
1>已用时间 00:00:03.71
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========



这里为什么会提示buf[]未声明呢?

回复列表 (共3个回复)

沙发

局部变量只能在函数内部可见。
eatspace函数看不到_tmain函数里面的buf变量。

板凳

谢谢你~ 我改了两个错误
1.就是你说的那个,现定义为全局变量如下:
//定义常量
const int MAX=80;
[color=FF0000]char buf[MAX]={0};[/color]
2.eatspace()函数里的j未初始化,现改为如下:
void eatspace(char *str)
{
    [color=FF0000]int i,j=0;[/color]
    ……
}

====================================================

运行通过,但输入字符串(即表达式)之后,不能计算正确结果!!
帮忙看下,为什么?

3 楼

while(buf[index]='*'||buf[index]='/')
这里应该写错了。
可能还有其他的错误。

我来回复

您尚未登录,请登录后再回复。点此登录或注册