将字符检查为换行符

Tay*_*rim 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;
}  
Run Code Online (Sandbox Code Playgroud)

它对所有文本文件都可以正常工作,但是当我将它调用到文件后,我在编译后得到它并没有给出wc给出的答案.

Kei*_*son 9

检查字符s[i]是否为换行符的方法很简单:

if (s[i] == '\n')
Run Code Online (Sandbox Code Playgroud)

如果您正在读取以文本模式(包括stdin)打开的文件,那么底层系统用于标记行尾的任何表示都将转换为单个'\n'字符.

你说你正在尝试编写自己的wc程序,并且通过比较'\n'你获得的结果与系统不同wc.你没有告诉我们足够的猜测为什么会发生这种情况.向我们展示您的代码,并告诉我们到底发生了什么.

如果您正在读取编码方式不同的文件(例如,尝试在Windows系统上读取Unix格式的文本文件),则可能会遇到问题.但那时wc会遇到同样的问题.


Dav*_*ave 5

ASCII 和 Unicode 中有几个换行符。

最著名的是\r\n,来自 ASCII。从技术上讲,这些是回车和换行。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