【问题标题】:Compiler error when declaring a variable - octal sequence 200 254 342 [duplicate]声明变量时出现编译器错误 - 八进制序列 200 254 342 [重复]
【发布时间】:2016-03-18 13:23:37
【问题描述】:

当此行不在注释中时:

double random_seed, participation_fee, ticket_revenue;

编译器产生以下错误:

main.cpp:24:2: error: stray ‘\200’ in program
main.cpp:24:2: error: stray ‘\254’ in program
main.cpp:24:2: error: stray ‘\342’ in program
main.cpp:24:2: error: stray ‘\200’ in program
main.cpp:24:2: error: stray ‘\254’ in program

我已经尝试重新输入此行。我使用Sublime Text 作为文本编辑器。我该如何解决这个问题?

这是整个函数:

void starting_game(vector<int>&players, vector<Player*> player_obj)
{
    int id, x, y, number=0;
    char pos;
    double random_seed,participation_fee,ticket_revenue;‬‬
    string input;
    cin >> number;
    for(int i = 0; i < number; i++)
    {
        cin >> id;
        cin.ignore(4,' ');
        cin >> x;
        cin.ignore(2,':');
        cin >> y;
        cin.ignore(2,':');
        cin >> pos;
        players.push_back(find_put(id, player_obj, x, y, pos));
    }
    //cin>>‫‪random_seed‬‬;//>>‫‪participation_fee‬‬>>‫‪ticket_revenue;‬‬
}

【问题讨论】:

  • 不是链接问题的副本。有问题的字符是不可见的(POP DIRECTIONAL FORMATTING、U+202c、"\342\200\254" in UTF-8),这使得解决这个问题变得更加困难。
  • 欢迎使用 StackOverflow。我已编辑您的帖子以使其更具可读性。为避免将来被否决,请在撰写帖子时更加小心。良好的语言通常有助于人们认真对待并回答您的问题。
  • 将整个内容复制并粘贴到纯文本编辑器中,然后返回。
  • 常见问题解答。真正的典型问题是 Compilation error: stray ‘\302’ in program, etc。这种类型的所有问题都可以用完全相同的方式分析:数字序列(通常)是八进制的。将它们转换为十六进制并搜索 UTF-8 序列以找到 Unicode code point。它可以通过在能够使用正则表达式搜索的文本编辑器中使用正则表达式搜索(使用\x{Unicodepoint})直接搜索(和替换)。

标签: c++


【解决方案1】:

您的代码中有不可见的字符会阻止编译器正常工作,因为它无法处理它们。

在您的具体情况下,其中一个字符是 U+202c,使用 UTF-8 编码。它被称为“POP DIRECTIONAL FORMATTING”,并且是不可见的。

由于是隐形的,解决这个问题会很困难。甚至问题中的代码也包含该字符。

要修复它,您可以执行以下操作:

  • 尝试删除整行以及下一行,然后重新键入文本。在您的特定情况下,如果您只是删除 contents 行并重新键入它,而不会杀死换行符,则字符会停留在行尾,并且可能会被保留。 (通过@PatrickTrentin

  • 使用删除所有非 ascii 字符的脚本。这很容易用python完成。将以下代码粘贴到名为script.py 的文本文件中,并使用python3 执行它。

    #!/usr/bin/python3
    import argparse
    import sys
    
    parser = argparse.ArgumentParser()
    
    parser.add_argument("infile", type=argparse.FileType("rb"))
    parser.add_argument("outfile", type=argparse.FileType("wb"))
    
    args = parser.parse_args()
    
    with args.infile as inf:
       intext = inf.read().decode("utf-8")
       with args.outfile as outf:
          outf.write("".join(
              c for c in intext
              if ord(c) <= 127
          ).encode("utf-8"))
    

    用法是python3 script.py input output。请不要输入两次相同的名称,否则将不起作用,您最终会得到一个空文件。无论如何,请在尝试之前备份您的文件!

  • 使用十六进制编辑器手动删除所有非 ASCII 字符。不幸的是,我不知道有谁好用。

在这种情况下,删除字符而不替换是正确的做法。在其他情况下(例如proposed duplicate),将有问题的字符替换为更合适的字符会更正确。这不是这里的情况。

【讨论】:

  • 解决方案很简单,只需手动重写double random_seed, participation_fee, ticket_revenue;,并用不祥的隐藏代码删除整行,例如在nano中使用ctrl+k.. [eta:我没有投票]
  • @PatrickTrentin 根据 OP 的说法,这没有帮助。这可能是由于代码实际上位于行尾,具体取决于编辑器。考虑到其他注释掉的行也有同样的问题,自动化的解决方案似乎适用☺
  • 对,诀窍是使用允许一次删除整行的编辑器,例如nano, vim, etc..。我自己在他的代码上试过。我认为你的答案实际上是一个很好的答案,只是想指出最简单的路径。 :)
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多