如何在C中的任何编码中检查字符是否为换行符?
我有一项任务是编写自己的 wc 程序。如果我只使用(s[i] == '\n')
,那么如果我将其称为自己,则会有另一个答案而不是原来的 wc 。
这是代码:
typedef struct
{
int newline;
int word;
int byte;
} info;
info count(int descr)
{
info kol;
kol.newline = 0;
kol.word = 0;
kol.byte = 0;
int len = 512;
char s[512];
int n;
errno = 0;
int flag1 = 1;
int flag2 = 1;
while(n = read(descr, s, len))
{
if(n == -1)
error("Error while reading.", errno);
errno = 0;
kol.byte+=n;
for(int i=0; i<n; i++)
{
if(flag1)
{
kol.newline++;
flag1 = 0;
}
if(isblank(s[i]) || s[i] == '\n')
flag2 = 1;
else
{
if(flag2)
{
kol.word++;
flag2 = 0;
}
}
if(s[i] == '\n')
flag1 = 1;
}
}
return kol;
}
它适用于所有文本文件,但是当我将其调用到文件后,我在编译后得到的答案 wc 给出了答案。
答案 0 :(得分:8)
检查字符s[i]
是否为换行符的方法很简单:
if (s[i] == '\n')
如果您正在读取以文本模式打开的文件(包括stdin
),那么底层系统用于标记行尾的任何表示形式都将转换为单个{{1} } character。
您说您正在尝试编写自己的'\n'
计划,并且通过与wc
进行比较,您获得的结果与系统的'\n'
不同。你没有告诉我们足够的猜测为什么会发生这种情况。向我们展示您的代码,并告诉我们到底发生了什么。
如果您正在读取编码方式不同的文件(例如,尝试在Windows系统上读取Unix格式的文本文件),则可能会遇到问题。但是wc
会有同样的问题。
答案 1 :(得分:4)
ASCII和Unicode中有几个换行符。
最着名的是来自ASCII的\r
和\n
。从技术上讲,这些是回车和换行。 Windows同时使用\r\n
(技术上回车意味着转到第0列,换行意味着转到下一行,但我知道在实践中没有任何服从),unix仅使用\n
。一些(不常见的)操作系统仅使用\r
。
大多数应用程序都停在那里,并且不会受此影响。以下内容更具理论性。
Unicode使事情复杂化。 U + 000A和U + 000B与\r
和\n
相同(UTF-8中的二进制表示相同)。然后是U + 0085“下一行”,U + 2028“行分隔符”和U + 2029“段分隔符”。如果要检查所有内容,还可以检查垂直选项卡(U + 000B)。见这里:http://en.wikipedia.org/wiki/Newline#Unicode
答案 2 :(得分:1)
据我所知,没有像isXXXXX()
那样的标准函数(最接近的函数是isspace()
,对于其他条件(空格,制表符,换页符等)也是如此。 。)。简单地比较'\ n'应该解决你的问题;根据你认为是换行符,你可能还想检查'\ r'(回车).UNIX标准作为行分隔符是'\ n',Mac(在OS X之前)使用'\ r'(现在'\ n'更常见,但'\ r'有时仍被某些应用程序使用,例如MS Office),DOS / Windows使用“\ r \ n \ n“序列。