这里有一个简单的问题,可能有一个棘手的答案:我正在寻找一种便携式和本地化友好方式来删除C中的尾随换行符,最好是基于标准的。 / p>
我已经知道以下解决方案:
解析\r
和\n
的某种组合。处理Windows,* nix和Mac时,实际上并不漂亮,所有这些都使用不同的序列来表示新行。另外,其他语言是否甚至对新行使用相同的转义序列?我希望这会在使用不同英语字形(例如日语等)的语言中爆炸。
删除尾随n
字节并替换最终\0
。看起来似乎是一种更加脆弱的方式。
isspace
看起来很诱人,但我只需要匹配换行符。其他空格被视为有效的令牌文本。
C ++有一个类可以做到这一点但在纯C世界中对我没什么帮助。
locale.h
似乎就像我所追求的那样,但我看不到任何与提取换行令牌有关的内容。
所以,有了这个,这是一个我将不得不滚动自己的实例#34;功能还是有什么我错过的?谢谢!
解决方案
我最后将Weather Vane
和Loic
的答案分别合并为最终解决方案。有用的是使用方便的strcspn
函数来打破从Loic提供的链接中选择的第一个换行符。因此,我可以根据许多支持的语言环境选择分隔符。一个好的观点是,在这个层面上有太多的支持一般;我甚至不知道西里尔文有几种竞争编码。
通过这种方式,我可以实现足够好的"多国支持,同时仍使用标准库函数。
因为我只能接受一个答案,所以我选择的是风向标,因为他是我用过的最后一次调用。话虽如此,这对我来说真的是两个答案。
答案 0 :(得分:1)
我认识的最好的是
buffer [ strcspn(buffer, "\r\n") ] = 0;
这是处理\r
和\n
的所有组合的安全方式 - 两者,一个或全部。
答案 1 :(得分:1)
我建议用一个标准空间(US-ASCII 0x20)替换一个或多个空白字符。仅考虑ISO-8859-1字符(https://en.wikipedia.org/wiki/ISO/IEC_8859-1),空格由0x00..0x20(C0控制字符和空格)和0x7F..0xA0(删除,C1控制字符和不间断空格)中的任何字节组成。 。请注意,US-ASCII是ISO-8859-1的子集。
但请注意,Windows 1251(https://en.wikipedia.org/wiki/Windows-1251)将不同的,可见(非控制)字符分配给0x80..0x9F范围。在这种情况下,这些字节不能被空格替换而不会丢失文本信息。
用于广泛定义空白字符的资源:
还要考虑到可以使用不同的编码,最常见的是:
但在非西方国家(例如俄罗斯,日本),进一步的角色编码也很常见。存在许多编码,但尝试支持每个已知编码可能没有意义。
因此尝试定义和限制您的用例,因为以完全通用性实现它意味着很多工作。
答案 2 :(得分:0)
这个答案适用于遇到同样问题的C ++用户。
匹配任何语言环境和字符类型的换行符都可以这样做:
if ["${CONFIGURATION}" != "Debug" ]; then
GOOGLE_APP_ID=1:1234567890:ios:ab123cd456ef789
"${PODS_ROOT}"/FirebaseCrash/upload-sym crash-service-account.json
fi
现在,删除所有尾随换行符可以这样做:
#include <locale>
template<class Char>
bool is_newline(Char c, std::locale const & loc = std::locale())
{
// Translate character into default locale and character type.
// Then, test against '\n', which is the only newline character there.
return std::use_facet< std::ctype<Char>>(loc).narrow(c, ' ') == '\n';
}
这应该是绝对可移植的,因为它仅依赖于标准C ++函数。