【问题标题】:C# string comparison issueC#字符串比较问题
【发布时间】:2017-12-11 04:47:12
【问题描述】:

我正在做一个项目,以制作一种超级基础的编程语言来取乐。我正在处理打印命令,它有 2 个不同的选项,直接打印或从堆栈打印。该程序已经在堆栈中有项目,但是每当它运行从堆栈打印的打印命令时,它都会跳过它。这是我的代码:

if (String.Equals(cmds[pos], "print"))
{
    if (cmds[pos + 1].StartsWith("\""))
    {
        Console.Write(cmds[pos + 1].Replace("\"", "").Replace(@"\q", "\"").Replace(@"\n", "\n"));
        outPos = pos + 2;
    }
    else if (string.Equals(cmds[pos + 1], "stack"))
    {
        Console.WriteLine(strStack.Pop());
        outPos = pos + 2;
    }
    else
    {
        //Console.WriteLine("HelloKreeKraw");
        outPos = pos + 1;
    }
}

下面是命令:

push "Hi\n"
throw stack
push "Hello"
print stack
print "World!\n"
end

push 命令压栈,end 命令结束程序。程序无缘无故跳过打印堆栈。我测试了所有可能的东西,除非我错过了什么?

编辑: string.replace 和 cmds[pos + 1].StartsWith("\"") 工作得很好,但是当它检查第二个单词是否堆栈时,它会随机出现故障。我已经发现是这种情况。

【问题讨论】:

  • 是的,嵌套的 if 更少,不确定尝试通过嵌套 if 来学习有什么好处。
  • 你能用断点先检查一些初步的东西吗,例如pos 是正确的(因为数组是从 0 开始的),cmds 数组正确地用空格等分割。
  • 这一行确保 Replace() 正常工作Console.Write(cmds[pos + 1].Replace("\"", "").Replace(@"\q", "\"").Replace(@"\n", "\n"));
  • 如果 (String.Equals(cmds[pos], "print")) 应该是 if (String.StartsWith(cmds[pos], "print"))
  • 当你调试你的代码时,这条线是否命中? if (cmds[pos + 1].StartsWith("\""))

标签: c# string string-comparison


【解决方案1】:

如果你想学习,你需要找一本关于 Lex 和 YACC/Bison 的书。基本上这里没有使用标准编译器理论。你需要构建你的语法,(命令 -> 变量 -> 新行)然后创建你的词法分析器来识别你的标记。解析令牌以发出代码/选项是一种更好的方法。

顺便说一句,如果您使用 C#,您可以通过首先在代码中构建表达式树然后只在最后执行它来获得一些真正的乐趣。更接近于构建真正的编译器:)。

那么最简单的方法是在你的实现中使用递归下降(而不是嵌套的 ifs...)来做你想做的事情。我们可以与您一起修复您的字符串处理,但这是一个已解决的问题,有一些更好的工具可以帮助您。

【讨论】:

    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多