【问题标题】:Converting string into char将字符串转换为字符
【发布时间】:2016-11-07 18:55:55
【问题描述】:

我在 C++ 中转换类型时遇到问题。我有一个表达式:string wholeExpression = "44*2";,我想将数字与运算符分开。 如果是运算符,我使用这部分代码:

    string subExpression;
    char skladnik;

subExpression = wholeExpression.substr(poczatek, lenght);
            skladnik = subExpression[0];

如果是数字:

subExpression = wholeExpression.substr(poczatek, lenght);
            skladnik = atoi(subExpression.c_str());

@编辑

switch (skladnik)
        {


        case '+':
        case '-':
        {

            while (topOfStack > 0 && stack[topOfStack - 1] != '(')
            {
                outPut += stack[topOfStack - 1] + przecinek;
                stack.resize(topOfStack - 1);
                topOfStack--;
            }
            stack += skladnik;
            topOfStack++;
            break;
        }

        case '/':
        case '*':
        {
            while (topOfStack > 0 && (stack[topOfStack - 1] == '*' || stack[topOfStack - 1] == '/'))
            {
                outPut += stack[topOfStack - 1] + przecinek;
                stack.resize(topOfStack - 1);
                topOfStack--;
            }
            stack += skladnik;
            topOfStack++;
            break;
        }

        case '(':
        {
            stack += skladnik;
            topOfStack++;
            break;
        }
        case ')':
        {
            while (stack[topOfStack - 1] != '(')
            {
                outPut += stack[topOfStack - 1] + przecinek;
                stack.resize(topOfStack - 1);
                topOfStack--;
            }
            if (stack[topOfStack - 1] == '(')
            {
                stack.resize(topOfStack - 1);
                topOfStack--;
            }
            break;
        }

        default:
        {
            outPut += to_string(skladnik) + przecinek;
            break;
        }
        }


    }

但突然之间,我遇到了从 40 到 43 以及 45 和 47 -> 的数字问题,它们是运算符(在 ASCII 码中)。它们可能不是由开关解释为数字,而是作为运算符。另一个数字完美地工作。我该如何解决这个问题?

【问题讨论】:

  • 你可以发布实际的switch 来代替这个吗?看到你的实现而不是你的伪代码会容易得多。
  • 我以为你会说它是 tl;dr。这就是为什么我试图缩短它
  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • 您需要保留两个不同的变量。尝试对两个不同的事物使用相同的变量是错误的经济。
  • @Mikkey 我在你的整个程序中没有看到一个isdigit()。这让我相信你做错了。解决此问题的直观方法是 1) 通过调用 isdigit 检测您是否位于数字的开头,如果是,则开始构建有效数字,直到遇到的字符不是数字。您似乎只是编写了一些“临时”代码,而没有任何真正的想法,或者至少是在纸上制定的计划。

标签: c++ char switch-statement


【解决方案1】:

您已经回答了自己的问题。数字 40 的 char 不存在。这是两个char 变量:4 和0。因为您将int 放入带有atoi 的char,它将使用ASCII 码。在不知道lenght 的值的情况下,很难说这确实是你的问题,但这里有两种可能的解决方案:

  1. 不要预先使用atoi。而是在您的 switch 语句之后将每个数字 char 解释为一个实际整数(4 和 0 将是 atoi('4') * 10 + atoi('0'))
  2. 使用intlongdouble 变量来保存您的数字。

【讨论】:

    【解决方案2】:

    您以两种不同的方式使用变量skladnik。在一个代码路径中,它指的是一个解码的整数,在第二个代码路径中,它指的是一个字符。一旦你把这个意思混为一谈,一旦你在switch,就没有办法知道它是什么意思。

    您应该使用两个不同的变量,一个用于解码数字,一个用于操作符字符。那么就不会有混乱了。

    【讨论】:

      猜你喜欢
      • 2019-10-10
      • 2019-01-05
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      相关资源
      最近更新 更多