代码之家  ›  专栏  ›  技术社区  ›  kliketa

如何使用Visual Studio 6 C++检测字符串中的换行字符

  •  1
  • kliketa  · 技术社区  · 15 年前

    我有一个来自某些(Windows/Unix/…)系统的多行ASCII字符串。现在,我知道了Windows和UNIX(CR-LF/LF)中新行字符的差异,我想在这两个字符(CR和LF)上解析这个字符串,以检测在这个字符串中使用哪一个换行符,所以我需要知道VS6C++中的“\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?我应该像cr+lf那样放\r\n“还是编译器解释\n”?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Michael Burr    15 年前
    inputString.find ("\n");
    

    将搜索LF字符(单独)。

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

        2
  •  1
  •   Yakov Galka    15 年前

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

        3
  •  1
  •   Community Mohan Dere    9 年前

    “n”和“r\n”之间的所有转换都是在I/O期间发生的。在所有其他时间,“\n”只是这个,而不是别的。

    不知何故: return (found != string::npos ? true : false); 让我想起 another answer 我写了一会儿。

        4
  •  1
  •   Timo Geusch    15 年前

    除了VS6部分(你真的非常想升级这个,编译器已经过时了,微软不再真正支持它),这个问题的答案取决于你是如何得到字符串的。

    例如,如果以文本模式从文件中读取,运行库将转换 \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行分隔符 \rn 你最好还是搜索那个字符序列。

    编辑: 如果你得到的是二进制形式的,是的,理想情况下你需要检查两者 \rn \n . 但是,我希望它们不会混合在一个字符串中,并且仍然具有相同的含义,除非它是一种真正混乱的数据格式。我可能会查一下 \rn 先然后 \n 第二,如果字符串足够短,扫描两次不会有太大的区别。如果是的话,我会写一些代码来检查两者 \rn \n 一次通过。