【问题标题】:C++ Weird encoded character added at the end of my char pointer在我的 char 指针末尾添加了 C++ 奇怪的编码字符
【发布时间】:2011-02-21 04:35:41
【问题描述】:

我有一个将中缀表示法转换为后缀表示法的功能。我遇到的唯一问题是生成的后缀符号字符串的最后一个字符是 ?

任何想法发生了什么?这就是功能。如果我打印作为参数传递的中缀 char*,它会正确打印。当我在函数末尾打印后缀 char* 时,我得到了 � 最后一个字符

   #include <iostream>
#include <string>
#include <fstream>
#include <string.h>
#include <ctype.h>
#include "queue.h"
#include "stack.h"

#define EXPRESSION_MAX_SIZE 50
#define MAX 10
#define EMPTY -1

using namespace std;

struct stack
{
    char data[MAX];
    int top;
};

【问题讨论】:

  • if( isdigit(*i) || isalpha(*i) ) 这一行是多余的。下面的 while 语句将保证相同的不变量。
  • 您也没有检查变量 line 是否可以真正适合数组中缀。你应该做这个检查。

标签: c++ string pointers character-encoding char


【解决方案1】:

您看到的乱码字符可能是您从空堆栈上的pop 返回的EMPTY 常量。在 pop 函数中粘贴 assert(!isempty(s)) 以确保您不会尝试从空堆栈中弹出。如果您在调试器中运行程序,调试器应该会显示触发assert 的上下文(即堆栈跟踪)。

尝试从空容器中弹出显示程序存在严重缺陷。您不应该只返回一个特殊值,并希望被调用者费心检查它。当检测到此类错误时,明智的做法是“立即失败,大声失败”。这将使查明错误原因变得更加容易。它还有助于确保在部署程序之前检测到错误。

【讨论】:

    【解决方案2】:

    在 main() 中将 line[] 复制到 infix[]:

    for(unsigned int i=0; i<=line.size(); i++)
    {
        infix[i] = line[i];
    }
    

    复制完成后,您未能终止中缀数组。您看到的字符是声明时的字符。

    【讨论】:

    • 代码使用&lt;=,因此复制了size+1字符,其中包括终止符。
    • 不要强调这一点,但字符串是否使用 null 来终止?有没有保证。这个 for 循环无论如何都是不好的形式。我更喜欢 strcpy(infix, line.c_str());
    • 不,字符串不必存储终止符。访问该位置相当于取消引用 end() 迭代器。不好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2012-07-19
    • 2010-10-23
    相关资源
    最近更新 更多