无法解释的 VIM 或 GCC 行为

unexplained behaviour of vim or gcc

本文关键字:GCC 行为 VIM 无法解释      更新时间:2023-10-16

我运行了这个简单的程序:

#include <iostream>
#include <string>
using namespace std;
#include <boost/regex.hpp>
int main ()
{
//    boost::regex fullname_regex ("[A–Z]+[a–z]*, [A-Z][a–z]*");
boost::regex fullname_regex ("[A-Z]+[a-z]*, [A-Z][a-z]*");
string name;
cout << "Enter you full name: " << flush;
getline (cin, name);
if (! regex_match (name, fullname_regex))
{
    cout << "Error: name not entered correctly" << endl;
}
return 0;
}

我只是从某个地方复制的。当我取消注释注释行(原始复制/粘贴的一部分)并注释下一个行(由我自己键入)时,程序总是拒绝该名称。否则,它将按预期工作。我正在使用 vim。我:set list看到了隐藏的字符,线条是相同的。我在原始行之前插入了一条长注释以将其向下移动,怀疑磁盘故障(非常旧的系统),但仍然遇到同样的错误。这是一个没有 gui 的 ubuntu 服务器,我使用 putty 来做到这一点。我不习惯在 linux 下出现这样的问题,如果有人对什么可以解释这种奇怪的行为有任何想法,请告诉我。也许 vim 仍然使用原始页面中的一些选项,这些选项确实在这里并且是格式化的,但:set list没有显示它们?

破折号不一样。注释的较长,由不同的字符表示,因此解释不同。常见的复制+粘贴错误。

http://en.wikipedia.org/wiki/Dash

注释

掉行中的-字符是 U+2013 EN DASH,而不是 ASCII 破折号 U+002d。

由于我使用的位图字体有限,打开文件时 Unicode 字符已经卡住,但您可以使用 g8 命令在光标下打印字符的 UTF-8 编码值,或使用 :call search('[^x00-x7F]') 查找下一个非 ASCII 字符。

当我将您的

代码粘贴到文本编辑器中时,我立即看到注释行中的第一个 [A-Z] 实际上使用了长破折号。

你想要一个简单的破折号,这就是你输入的。

您似乎对:set list的目的感到困惑.它不是为了显示一般的"奇怪"字符而设计的:只有一个非常小的集合(制表符,不间断空格,尾随空格......),有关详细信息,请参阅:help 'list'

在这种情况下,set list无济于事。

常规空格转换为不间断空格由set list负责,但是从 Web 或 PDF 或邮件客户端和文本处理器复制粘贴时,您应该担心其他特殊字符:"经常被 替换,' 等替换......前几天我有很长的一段话,所有的'都替换为¹。在这种情况下很容易发现,但在其他情况下很容易错过。