将字符检查为换行符

时间:2013-03-31 19:39:10

标签: c char

如何在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 给出了答案。

3 个答案:

答案 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“序列。