15

如何检查一个字符是否是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给出的答案。

4

3 回答 3

11

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

if (s[i] == '\n')

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

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

如果您正在读取编码不同的文件,您可能会遇到问题——例如,尝试在 Windows 系统上读取 Unix 格式的文本文件。但那样wc就会有同样的问题。

于 2013-03-31T20:14:09.147 回答
5

ASCII 和 Unicode 中有几个换行符。

最著名的是\r\n,来自 ASCII。从技术上讲,这些是回车和换行。Windows 同时使用两者\r\n(从技术上讲,回车意味着转到第 0 列,换行意味着转到下一行,但我所知道的实际上没有遵守这一点),unix 只使用\n. 一些(不常见的)操作系统只使用\r.

大多数应用程序都停在那里,并且不会为此受苦。接下来的内容更具理论性。

Unicode 使事情变得复杂。U+000A 和 U+000B 与\rand\n相同(在 UTF-8 中相同的二进制表示)。然后是 U+0085“下一行”、U+2028“行分隔符”和 U+2029“段落分隔符”。如果要检查所有内容,还可以检查垂直制表符 (U+000B)。见这里:http ://en.wikipedia.org/wiki/Newline#Unicode

于 2013-03-31T19:48:14.837 回答
1

据我所知,没有类似的标准功能isXXXXX()(最接近的是isspace(),对于其他条件(空格、制表符、换页...)也是如此。简单地比较 '\n' 应该可以解决您的问题问题;根据您认为是换行符的内容,您可能还需要检查“\r”(回车)。作为行分隔符的 UNIX 标准是“\n”,Mac(在 OS X 之前)使用“\r” '(现在 '\n' 更常见,但 '\r' 有时仍被某些应用程序使用,例如 MS Office),DOS/Windows 使用 "\r\n" 序列。

于 2013-03-31T19:50:00.397 回答