C ++ для принятия строки в соответствии с определенным правилом (num opr num)

I have a program that accepts particular string according to a defined rule, i.e., number operator number. For example:2+4-5*9/8

Вышеприведенная строка является приемлемой. Теперь, когда я ввожу что-то вроде 2 + 4-a , он снова показывает приемлемый, который полностью неприемлем, поскольку числовое значение должно находиться только от 0 до 9 в соответствии с определенным правилом. Я думаю, что мне нужно будет использовать значения ASCII для проверки.

См. Следующий код:

#include 
#include 
#include 
#include 

int check(int stvalue) {
    if(stvalue < 9) return(1);
    else return(0);
}

main() {
    int flag = 0;
    char str[10];
    std::cout << "Enter the string:";
    std::cin >> str;
    int i = 1;
    int n = strlen(str);
    for(i = 0; i < n - 1; i += 2) {
        if(!check(str[i])) {
            if(str[i + 1] == '+' || str[i + 1] == '-' || str[i + 1] == '/' || str[i + 1] == '*') flag = 1;
            else {
                flag = 0;
                break;
            }
        }
    }
    if(flag == 1) std::cout << "String is acceptable" << std::endl;
    else std::cout << "String is not acceptable\n" << std::endl;
    getch();
}

ВЫВОД:

 Enter the string:2+4-5
 String is acceptable

 Enter the string:3*5--8
 String is not acceptable

 Enter the string:3+5/a
 String is acceptable 

Последний выход не должен быть приемлемым.

0
Вероятно, вам нужна проверка (str [i] - '0')
добавлено автор Karthik T, источник

5 ответы

int check(int stvalue) {
    if(stvalue < 9) return(1);
    else return(0);
}

Это неверно, поскольку числовые эквиваленты на диаграмме ASCII составляют от 48 до 57, начиная от 0 до 9.

Возможно, вы упростите свою проверку, передав ее с помощью функции, аналогичной этой:

#include 
bool validateString(const std::string& str) {
   auto compare = [](char c) {
        return ((c == '+') || (c == '-') || (c == '*') || (c == '/'));
    };
    size_t length = str.length();
    for(size_t i = 0; i < length; ++i) {
        if(!(std::isdigit(str[i]) || compare(str[i])))
            return false;
        if(compare(str[i]) && (i <= length-1) && compare(str[i+1]))
            return false;
        if(compare(str[length-1]))
            return false;
    }
    return true;
}
2
добавлено
Это все еще не работает. Это подтвердит +++++ как true , когда он явно сломает требуемый формат.
добавлено автор dreamlax, источник
@Bhavyanshu Я уже исправил это и добавил случай, если оператор в конце, вы, вероятно, можете сделать то же самое и для фронта.
добавлено автор Rapptz, источник
@dreamlax oh спасибо, я пойду дальше и исправлю :)
добавлено автор Rapptz, источник
Код @Rapptz Karthik - это в значительной степени то, что я хочу, но он также имеет ту же проблему, что и ваша. Отображение приемлемо для ++++. Я согласен с тем, что функция проверки неверна. Если вы можете просто исправить свой код, это будет очень полезно. :)
добавлено автор Bhavyanshu, источник

Вот несколько советов:

  1. Your loop only checks an even amount of characters in your input. Your loop adds 2 to n each time, so it will check 3+ and 5/ but a will never get looked at.
  2. If your input is always alternating between a single digit number and an operator, you can use something like the following:

    for (int i = 0; i < n; i++)//read *every* character
    {
        if (i % 2 == 0)
        {
           //you are looking at a character with an even index
        }
        else
        {
           //you are looking at a character with an odd index
        }
    }
    

    The % operator divides the left operand by the right and gives you the remainder of that division.

  3. Your check function is checking whether the char value is less than 9, not whether the char value represents a digit character. You can include the header and use isdigit instead of your check function, which checks to see if the input represents a digit character or not.

1
добавлено
for(i = 0; i < n - 1; i += 2) {

Вы не проверяете последний символ строки, поэтому заканчивается последний a .

Помните, что strlen не содержит нулевой символ, вам не нужно его настраивать.

Также используйте check (str [i] - '0') , так как вы хотите проверить номер, а не его код ascii.

Последний большой вопрос -

if(str[i] == '+' || str[i] == 

If check fails, you need to check if that char is an operator, not the next one, as above. Output

Также установите флаг как 1 по умолчанию. У меня немного переписать код .

Далее переписан код, который ловит повторяющиеся цифры или операторы

1
добавлено
@KarthikT: Это не работает для 1 ++++ 1 , оно вернет true , когда правила OP говорят, что это должно быть false .
добавлено автор dreamlax, источник
@Bhavyanshu AH! Если проверка завершается с ошибкой, значит, это означает, что текущий символ не является int, поэтому должен быть оператор? зачем делать +1?
добавлено автор Karthik T, источник
@Bhavyanshu вы логика меня смущает .. может быть, некоторые переписывания в порядке ..
добавлено автор Karthik T, источник
@Bhavyanshu pls проверяет мое редактирование для фиксированного кода.
добавлено автор Karthik T, источник
@Bhavyanshu плохая ссылка .. gimme sec to redo ..
добавлено автор Karthik T, источник
@Bhavyanshu pls см. LWS
добавлено автор Karthik T, источник
Стиль @Bhavyanshu dreamlax лучше поймать эту проблему, однако вы можете сделать это также
добавлено автор Karthik T, источник
Большое спасибо. Сейчас он работает хорошо. Можете ли вы немного объяснить мне, почему на выходе есть «1»?
добавлено автор Bhavyanshu, источник
Я думаю, что я должен использовать isdigit вместо проверки ..! Но ваш ответ в значительной степени близок к тому, что я хочу, поэтому это приемлемо. Я посмотрю, что можно сделать для ввода как 1 +++ 1. :)
добавлено автор Bhavyanshu, источник
О, неважно..и получилось ... это значение флага ... не видно в коде. Я становлюсь слепым. : P Спасибо большое!
добавлено автор Bhavyanshu, источник
Ohkay Wait .. мне проверить!
добавлено автор Bhavyanshu, источник
Ваш код определенно проверяет алфавиты, но теперь он не работает с 4-5 + 4 * 7, что является приемлемой строкой.
добавлено автор Bhavyanshu, источник
Он показывает приемлемый даже на входе a-2 + 5, а также на 2-a + 5
добавлено автор Bhavyanshu, источник

Числа - это тип символа, поэтому проверьте их значение ASCII, чтобы узнать, являются ли они числами.

0
добавлено

ASCII value if 0 is 48 and 9 is 57.. not 9. So, if(stvalue < 9) return(1);

should be, if(stvalue <= 57) return(1);

Кстати, этот подход может работать, но другие ответы - более зрелый способ решения этой проблемы.

0
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest