0

我有一个根据定义的规则接受特定字符串的程序,即数字运算符号。例如:2+4-5*9/8

上面的字符串是可以接受的。现在,当我输入类似的内容时2+4-a,它再次显示可以接受,这是完全不可接受的,因为根据定义的规则,数字值的范围应仅在 0 到 9 之间。我想我将不得不使用 ASCII 值来检查。

参考下面的代码:

#include <iostream>
#include <ncurses.h>
#include <string.h>
#include <curses.h>

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 

最后的输出不应该是可接受的。

4

5 回答 5

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

这是错误的,因为 ASCII 图表上的等价数字是 48 到 57,从 0 到 9。

您可以通过类似于以下的函数传递验证来简化验证:

#include <cctype>
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;
}
于 2013-02-07T07:23:56.967 回答
1
for(i = 0; i < n - 1; i += 2) {

您不检查字符串的最后一个字符,因此最终a通过。

记住strlen不包括空字符,你不需要调整它。

也可以使用check(str[i] - '0'),因为您要检查数字而不是其 ascii 代码。

最后一个大问题——

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

如果检查失败,您需要检查该 char 是否为 operator而不是 next,如上所述。输出

默认情况下也将 flag 设置为 1。我已经稍微改写了你的代码

进一步重写代码,捕获重复的数字或运算符

于 2013-02-07T07:16:13.220 回答
1

这里有一些提示:

  1. 您的循环仅检查输入中的偶数字符。您的循环n每次添加 2,因此它会检查但3+永远不会被查看。5/a
  2. 如果您的输入总是在单个数字和运算符之间交替,您可以使用以下内容:

    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
        }
    }
    

    运算符将%左操作数除以右,并为您提供该除法的余数。

  3. 您的check功能是检查该char值是否小于 9,而不是该char值是否代表数字字符。您可以包含<cctype>标题并使用isdigit而不是您的check函数,该函数检查输入是否代表数字字符。

于 2013-02-07T07:16:29.713 回答
0

这些数字是 char 类型,因此请检查它们的 ASCII 值以查看它们是否是数字。

于 2013-02-07T07:11:17.640 回答
0

如果 0 是 48 并且 9 是 57.. 不是 9,则为 ASCII 值。所以,如果(stvalue < 9)返回(1);

应该是,if(stvalue <= 57) return(1);

顺便说一句,这种方法可能有效,但其他答案是解决这个问题的更成熟的方法。

于 2013-02-07T07:33:48.433 回答