无法比较C ++中的字符串

时间:2011-11-15 18:09:46

标签: c++ string-comparison

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string>
#include <iostream>

FILE *pfile;
using namespace std;

string temp_string;
string reserved[25] = {"AND", "CALL", "DECLARE", "DO", "ELSE", "ENDDECLARE", "ENDFUNCTION", "ENDIF", "ENDPROCEDURE", "ENDPROGRAM", "EXIT", "FALSE", "FOR", "FUNCTION", "IF", "IN", "INOUT", "NOT","OR", "PROCEDURE", "PROGRAM", "RETURN", "THEN", "TRUE", "WHILE"};


int main(void)
{
    pfile = fopen("hello.cel", "r");
    char cha, temp_token[30], temp;
    int count = 0, check = 1, i;
    cha = fgetc(pfile);
    while (cha != EOF)
    {
        if(isalpha(cha) || cha == '_')
        {
            temp_token[0] = cha;
            count = 1;
            cha = fgetc(pfile);
            while(isdigit(cha) || isalpha(cha) || cha == '_')
            {
                if(count < 30)
                {
                    temp_token[count] = cha;
                    count++;
                }
                cha = fgetc(pfile);         
            }
            count--;
            for(i = 0; i <= count; i++)
            {
                temp_string += temp_token[i];
            }
            cout << temp_string;
            for(i = 0; i < 25; i++)
            {
                if(temp_string == reserved[i])
                {
                    printf(": RESERVED\n");
                }
                else
                {
                    printf(": ALPHA\n");
                }
            }

            cha = ungetc(cha, pfile);
            count = 0;
        }
        fclose(pfile);
}

我对reserved [i]和temp_string字符串之间的比较语句有问题。我不能成功打印“RESERVED”,它总是打印“ALPHA”。 据您所知,这是一个程序,它从文件(hello.cel)中获取每个字符并打印每个标记的类型。

编辑:temp_token是一个字符串,是我临时存储的字样。这句话是通过在此行temp_string += temp_token[i];

添加字符来实现的

2 个答案:

答案 0 :(得分:0)

未声明temp_string。

您是否将temp_string声明为字符串? 对我来说,打印为关键字保留。

答案 1 :(得分:0)

循环结束有点粗略;你错过了},而ungetc()听起来完全是错误的。你需要改变

            cha = ungetc(cha, pfile);
            count = 0;
        }
        fclose(pfile);
}

        }
        cha = fgetc(pfile);
    }
    fclose(pfile);
}

在填充它的循环之前声明temp_string(或者,如果你真的希望它由于某种原因是全局的,那么在那时调用clear())。更好的是,在删除无意义的count--

之后,从缓冲区初始化它
std::string temp_string(temp_token, temp_token+count);

甚至更好的是,摆脱临时缓冲区,并在读取字符时构建字符串:

        std::string token(1, cha);
        cha = fgetc(pfile);
        while(isdigit(cha) || isalpha(cha) || cha == '_')
        {
            if(token.size() < 30)
            {
                token.push_back(cha);
            }
            cha = fgetc(pfile);         
        }

最后,只检查所有保留的令牌后才打印ALPHA

bool is_reserved = false;
for(i = 0; i < 25; i++)
{
    if(token == reserved[i])
    {
        is_reserved = true;
        break;
    }
}
printf(": %s\n", is_reserved ? "RESERVED" : "ALPHA");

Here是一个破损较少的版本。