Невозможно сравнить строки в C ++ - PullRequest
0 голосов
/ 15 ноября 2011
#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);
}

У меня проблема с оператором сравнения между зарезервированными строками [i] и temp_string. Я не могу успешно печатать «ЗАБРОНИРОВАН», это всегда печатать «АЛЬФА». Насколько вам известно, это программа, которая получает каждый символ из файла (hello.cel) и печатает тип каждого токена.

РЕДАКТИРОВАТЬ: temp_token - это строка, в которой я временно храню слова. Эти слова были сделаны путем добавления символов в этой строке temp_string += temp_token[i];

Ответы [ 2 ]

0 голосов
/ 15 ноября 2011

Конец цикла становится немного схематичным;у вас отсутствует }, а 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");

Здесь - менее сломанная версия.

0 голосов
/ 15 ноября 2011

строка_строки не объявлена.

Вы объявили temp_string как строку? Для меня это печатается Зарезервировано для ключевых слов.

...