【问题标题】:How to detect newline character(s) in string using Visual Studio 6 C++如何使用 Visual Studio 6 C++ 检测字符串中的换行符
【发布时间】:2010-09-28 20:52:20
【问题描述】:

我有一个来自某些 (Windows/UNIX/...) 系统的多行 ASCII 字符串。现在,我知道 Windows 和 UNIX(CR-LF / LF)中换行符的差异,我想在两个(CR 和 LF)字符上解析这个字符串,以检测这个字符串中使用了哪些换行符,所以我需要知道 VS6 C++ 中的“\n”是什么意思。

我的问题是我是否在 Visual Studio 6 for Windows 中编写代码:

bool FindNewline (string & inputString) {
    size_t found;
    found = inputString.find ("\n");
    return (found != string::npos ? true : false);
}

这是搜索 CR+LF 还是只搜索 LF?我应该输入“\r\n”还是编译器像CR+LF一样解释“\n”?

【问题讨论】:

  • 使用inputString.find('\n'),因为你只有一个字符可以匹配。 ?不需要三元返回语句,只需使用return (found != string::npos);
  • 我可能想在末尾匹配更多字符和换行符。 '\n' 又是如何解释的——比如一个或多个字符?

标签: c++ visual-studio string newline


【解决方案1】:
inputString.find ("\n");

将搜索 LF 字符(单独)。

当对文本流执行 I/O 时,库例程可能会在 CR/LF 和 '\n' 之间“转换”,但在程序代码的范围内,“\n”只是一个换行符。

【讨论】:

    【解决方案2】:

    “\n”表示“\n”。没有其他的。所以你只搜索 LF。但是,当您以文本模式读取文件时,Microsoft CRT 会为您进行一些转换,因此您有时可以编写更简单的代码。

    【讨论】:

      【解决方案3】:

      “\n”和“\r\n”之间的所有转换都发生在 I/O 期间。其他时候,"\n" 仅此而已。

      不知何故:return (found != string::npos ? true : false); 让我想起了我不久前写的another answer

      【讨论】:

      • 由于我以二进制形式获取字符串,因此我想检查两种情况(LF 和 CR+LF 情况)。在这种环境下,我应该搜索“\n”和“\r\n”,对吗?在我的情况下,“\n”是指 LF,“\r\n”是指 CR+LF 吗?
      • @Kliketa:对你的两个问题都是肯定的。
      【解决方案4】:

      除了 VS6 部分(您真的非常想升级它,编译器已经过时,Microsoft 不再真正支持它),问题的答案取决于您如何获取字符串。

      例如,如果您以文本模式从文件中读取它,运行时库会将\r\n 转换为\n. So if all your text strings are read in text mode via the usual file-based APIs, your search for\n`(即,仅换行符)就足够了。

      如果字符串源自在 Windows 上以二进制模式读取的文件,并且已知包含 DOS/Windows 行分隔符 \r\n,则最好搜索该字符序列。

      编辑:如果您确实以二进制形式获得它,是的,理想情况下您必须同时检查\r\n\n。但是我希望它们不会混合在一个字符串中并且仍然具有相同的含义,除非它是一种非常混乱的数据格式。如果字符串足够短,我可能会先检查\r\n,然后再检查\n,并且扫描两次并没有太大区别。如果是这样,我会编写一些代码,一次性检查\r\n 和单个\n

      【讨论】:

      • 由于我以二进制形式获取字符串,因此我想检查两种情况(LF 和 CR+LF 情况)。在这种环境下,我应该搜索“\n”和“\r\n”,对吗?在我的情况下,“\n”是指 LF,“\r\n”是指 CR+LF 吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 2014-07-16
      相关资源
      最近更新 更多