c++ - 通过 ifstream 的 Char 指针和字符串

标签 c++ parsing input fstream

所以我有这个递归下降解析器,它可以很好地通过命令行参数识别和使用值,但我不确定如何将其移植到从 .dat 文件中读取,使用正确的字符指针,打印字符串,然后工作对于多个字符串。

使用命令行参数的解析器:

#include <iostream>
#include <fstream>

using namespace std;

bool A(void);
bool E(void);
bool T(void);
bool F(void);
bool P(void);
bool I(void);
bool L(void);

char *c;

int main(int argc, char *argv[]){

    c = argc == 2 ? argv[1] : (char *)"";

    if (A() && *c == '\0') {
        cout << "The string \"" << argv[1] << "\" is in the language." << endl;
    }
    else {
        cout << "The string \"" << argv[1] << "\" is not in the language." << endl;
    }

    return 0;
}

bool A(void){

    if( I() )
    {
        if ( *c == '=' ){
            ++c;
            if ( E() )
            return true;
        }
    }
    return false;
}

bool E(void){

    if( T() ){
        if ( *c == '+' || *c == '-' ){
                ++c;
                return E();
        }
        return true;
    }
    return false;
}

bool F(void){

    if( P() ){
        if( *c == '^'){
            ++c;
            return F();
        }
    return true;
    }
    return false;
}

bool I(void){

    if ( *c >= 'a' && *c <= 'z'){
        ++c;
        return true;
    }
    return false;
}

bool L(void){

    if ( *c >= '0' && *c <= '9' ){
        ++c;
        return true;
    }
    return false;
}

bool P(void){

    if ( I() ){
        return true;
    }
    else
    if ( L() ){
        return true;
    }
    else
    if ( *c == '(' ){
            ++c;
            if ( E() ){
                    if ( *c == ')' ){
                        ++c;
                        return true;
                    }
            }
    }
    return false;
}

bool T(void){

    if( F() ){
        if ( *c == '*' || *c == '/' ){
                ++c;
                return T();
        }
        return true;
    }
    return false;
}

我不知道我可以用什么替换 argv[1] 来打印字符串。 要获得正确的字符指针,我可以这样做吗?

ifstream fin("input.dat");
        while (fin >> *c)

当我尝试这样做时,我遇到了段错误。

最佳答案

您要求流将值存储到 c 指向的值所表示的内容中。取而代之的是:

char ch;
char *c = &ch;

ifstream fin("input.dat");
while (fin >> ch) {
    // whatever
}

这不会立即出现段错误。但是,当您在解析函数中更改 c 的值时,“下一次”迭代会发生不好的事情。

您需要重构程序并从读取下一个字符的方法(通过递增指针,或从流,或其他)。

或者您也可以将文件读入一个大的内存缓冲区,然后将该缓冲区视为从命令行传递的字符串。

关于c++ - 通过 ifstream 的 Char 指针和字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5413964/

相关文章:

java - 当整个json是一个数组时解析jsonobject?

ruby-on-rails - 在 Ruby 中解析街道地址

javascript - thymeleaf - 有没有办法传递无法从输入元素中编辑或删除的字符串?

c - 如何以编程方式检查输入是否包含点?

html - 真的有必要在 html 输入中包含 type ="text"属性吗?

c++ - 字符串变量中使用的宏定义

php - 那么...人们如何使用 Visual C(++) 进行编程?

具有 2 个线程的 C++ 队列

c++ - 绘制 GL_TEXTURE_RECTANGLE 与 GL_TEXTURE_2D

python - 在 python 中解析 METAR 网页