C语言 检查字符是否为换行符

qjp7pelc  于 2022-12-17  发布在  其他
关注(0)|答案(3)|浏览(492)

如何检查一个字符是否是一个换行符在任何编码在C中?
我有一个任务是写我自己的***wc***程序。如果我使用just if (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***给出的答案。

9wbgstp7

9wbgstp71#

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

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

如果您正在阅读一个以文本模式打开的文件(包括stdin),那么底层系统用于标记行尾的任何表示都将被转换为单个'\n'字符。
您说您正在尝试编写自己的wc程序,通过与'\n'进行比较,您得到的结果与系统的wc不同。您没有提供足够的信息来猜测发生这种情况的原因。请向我们展示您的代码并确切地告诉我们发生了什么。
如果您正在阅读一个编码不同的文件,您可能会遇到问题--例如,尝试在Windows系统上读取一个Unix的文本文件。

qnyhuwrf

qnyhuwrf2#

ASCII和Unicode中有几个换行符。
最有名的是\r\n,来自ASCII。从技术上讲,它们是回车和换行符。Windows将两者一起使用\r\n(从技术上讲,回车意味着转到第0列,换行符意味着转到下一行,但据我所知,实际上没有什么操作系统遵守这一点),UNIX只使用\n。一些(不常见)操作系统只使用\r
大多数应用程序到此为止,并没有因此而受到影响。下面是更多的理论。
Unicode使事情复杂化。U+000 A和U+000 B与\r\n相同(UTF-8中相同的二进制表示)。然后是U+0085“下一行”,U+2028“行分隔符”和U+2029“段落分隔符”。如果你想检查所有内容,你也可以检查垂直制表符(U+000 B)。请看这里:http://en.wikipedia.org/wiki/Newline#Unicode

zysjyyx4

zysjyyx43#

据我所知,没有像isXXXXX()那样的标准函数(最接近的是isspace(),对于其他条件(空格、制表符、换页符......)也是如此。根据您认为是换行符的内容,您可能还需要检查'\r'(回车)。UNIX标准的行分隔符是'\n',Mac(OS X之前)使用'\r'(现在'\n'更常见,但'\r'有时仍被某些应用程序使用,例如MS Office),DOS/Windows使用"\r\n"序列。

相关问题