我正在编写一个读取文本文件的程序,并将这些字符读入数组。
我需要在数组中逐个字符地完成它,并且我需要清理空格,标点符号和大小写的字符。
我已经编写了代码来执行此操作。但是,我所遵循的作业有一个特定的文本文档,我将要清理。
问题是文档中的撇号没有被ispunct函数标记。如果我删除文本文档中的撇号并用普通撇号替换它们,它可以正常工作。我认为这不够好,因为我不会使用我自己的文本文件来证明该程序的有效性。
我尝试过专门针对该撇号的声明:
否则if(c ==''')[从c = fgetc(fp)拉出],我得到一个多字符字符常量[-Wmultichar]。
这个小细节让我疯了,我不知道为什么撇号不同!
“那是”这是文档中的一段文字,当转换为十六进制等于74 68 61 74 e2 80 99 73。
答案 0 :(得分:2)
也许您的输入是UTF-8编码的(这是一件好事,请阅读UTF8 everywhere)。只有您(或您的用户)可以告诉(但请阅读byte order marks)。在Linux上,file(1)命令通常可以猜测UTF-8编码的文本文件。
但是UTF-8是一个可变字节编码(一些Unicode字符由几个字节表示,而在几乎所有C11实现中,一个字节是char
)最近的C11标准并不为人所知。所以你需要解析你的字节流为UTF-8。请注意,strlen不再给出UTF-8 字符的数量(或长度),而只是 bytes 中的长度。因此,您应该将char
视为字节,而不是Unicode字符。
我建议使用一些外部库进行UTF-8解析,例如Glib Unicode Manipulation函数或更简单的libunistring。如果不允许使用这样的外部库,则可以通过跳过设置了较高位的每个char
忽略每个多字节 UTF-8字符(但如果你想要的话可能会很棘手)编写可移植的C代码,因为某些C实现的char
与signed char
相同,而其他实现的char
与unsigned char
相同。我不建议使用wchar_t
,这是特定于实现和操作系统(在Linux和Windows上有所不同)。
我试过了
else if(c=='’')
包含上述代码块的C源文件(很可能)也是UTF-8编码的,因此字符文字'’'
是一个多字节字符文字(如'ab'
或{{1}实际上它是 '⬮'
,与U+2019 RIGHT SINGLE QUOTATION MARK
相同,其解释是特定于实现的。通常,您应该避免在C源代码中避免使用此类多字节字符(在'\342\200\231'
或注释等文字字符串之外)。
答案 1 :(得分:0)
更好的方法可能是考虑在你剥夺了所有非法的字符后剩下的字符。如果它只是a-z
以及其他一些,这是一个易于检测的范围。