проверка входной строки без внешних библиотек для c ++ - PullRequest
0 голосов
/ 09 декабря 2011

Мне нужно проверить одну входную строку от пользователя. В конце концов это нужно будет разбить на две координаты. то есть а4 с3. И как только они являются координатами, их нужно разбить на 4 отдельных целых. a = 0 b = 1 и т. д. Они также должны соответствовать следующим условиям:

Если достигнут сигнал окончания ввода, программа завершается. В противном случае все не алфавитно-цифровые символы удаляются из ввода. Если остается только одна буква «Q» Затем программа выходит. Если то, что осталось, состоит из 4 символов, с одной буквой и одной цифрой среди первых двух символов и одной буквой и одной цифрой среди последних двух символов, и если каждая пара букв и цифр находится в допустимом диапазоне для нашей сетки Тогда ввод приемлем.

Я полностью обдумал и разрушил свою функцию. Пожалуйста, дайте мне знать, где я могу сделать некоторые исправления.

В основном у меня возникают проблемы при переходе от одной строки к четырем символам, если и только если данные действительны. Все остальное я могу справиться.

Вот что у меня есть.

void Grid::playerMove()
{
    string rawMove;
    string pair1 = "  ";
    string pair2 = "  ";
    bool goodInput = false;
    char maxChar = 'a';
    char chary1, chary2;
    int x11,x22,y11,y22;
    for (int i =0; i<size; i++)
    {
        maxChar++;
    }

    while(!goodInput)
    {
        cout<<"What two dots would you like to connect? (Q to quit) ";
        cin>>rawMove;
        rawMove = reduceWords(rawMove);
        if (rawMove == "Q")
        {
            cout<<"end game";
            goodInput = false;
        }
        else if (rawMove.size() == 4)
        {
            for(int j=0;j<2;j++)
            {
                if (pair1[j] >='a' && pair1[j] <=maxChar)
                {
                    chary1 = pair1[j];
                }
                else if(pair1[j] >=0 && pairl[j]<=size+1)
                {
                    x1 = pair1[j];
                }
            }
        for(int k=0;k<2;k++)
        {
            if (pair2[k] >='a' && pair2[k] <=maxChar)
            {
                chary2 = pair2[k];
            }
            else if(pair2[k] >=0 && pair2[k]<=size+1)
            {
                x2 = pair2[k];
            }
        }
    }
    if(char1 != NULL && char2 != NULL && x1 !=NULL && x2 != NULL)
    {
        for (int m = 0; m <= size m++)
        {
            if (char1 == m;)
            {
                x1 = m;
            }
        }
        for (int n = 0; n <= size n++)
        {
            if (char2 == n)
            {
                x2 = n;
            }
        }
    }
}

Конечной целью было бы иметь x1, x2, y1 и y2 с соответствующими значениями.

Имейте в виду, мне не разрешено иметь какие-либо внешние библиотеки.

Ответы [ 2 ]

1 голос
/ 16 апреля 2012

Не совсем ясно, чего именно вы хотите достичь, но вот несколько указателей, с которых можно начать:

  1. Цикл while никогда не закончится, потому что вы устанавливаете goodInput вfalse при выходе, что позволяет продолжить цикл.

  2. Возможно, код даже не компилируется?Вам не хватает фигурной закрывающей скобки ..

  3. Вы инициализируете pair1 и pair2 пустыми строками, но никогда больше не меняете их, поэтому они никогда не будут содержать никакой реальной информации о вашемперемещает

  4. возможно что вы действительно хотите, чтобы сначала разбить rawMove на подстроки pair1 и pair2?

0 голосов
/ 16 апреля 2012

Поскольку это домашнее задание - и вы должны учиться у них (верно?) - я не собираюсь давать вам полный ответ, а скорее что-то вроде рецепта:

  • Используйте std::istream::getline(char*, std::streamsize s), чтобы прочитать всю строку из std::cin.Убедитесь, что вы выделите достаточно большой буфер для хранения ожидаемого ввода (включая завершающий символ null), а также еще немного для недопустимых символов.После вызова проверьте failbit (ввод был слишком длинным) и eofbit (попадание в конец ввода) потока std::cin и обработайте эти случаи.Создайте std::string из буфера, если ошибки не было или EOF не был достигнут.

  • Напишите функцию классификации символов (например, вызовите ее isAlNum(char c)), которая возвращает true если аргумент char является буквенно-цифровым, и false в противном случае.

  • Объедините std::string::erase(), std::remove_if(), std::not1(), std::ptr_fun() и вашу функцию isAlNum() для очистки входной строки.

  • Напишите функцию, которая проверяет и анализирует координаты из очищенной входной строки и вызывает ее с помощью очищенной входной строки.

  • Оберните все это в соответствующую петлю while().

Это должно привести вас в правильном направлении.Конечно, если вам разрешено использовать функции C ++ 11 и вы знаете, как писать хорошие регулярные выражения, во что бы то ни стало, используйте заголовок <regex> вместо выполнения синтаксического анализа вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...