1

我正在学习 C 和系统编程。我正在尝试读取文本文件并以小写形式打印出单词。所有非字母字符都将是分隔符。我得到下面的输出。有人可以看看我的代码并给我一些关于如何删除单词之间的线条的提示吗?谢谢!

这是我的文本文件的开头:

荷马的伊利亚特古腾堡计划电子书,荷马

这本电子书可供任何人在任何地方免费使用,几乎没有任何限制。您可以根据本电子书或在线 www.gutenberg.org 中包含的 Project Gutenberg 许可条款复制、赠送或重新使用它

书名:荷马的伊利亚特

作者:荷马

译者:Andrew Lang, MA, Walter Leaf, Litt.D., 和 Ernest Myers, MA

发布日期:2012 年 1 月 14 日 [电子书 #3059] 发布日期:2002 年 2 月

英语语言

这是我的输出: 荷马的 iliad 的项目古腾堡电子书

由本垒打

这本电子书可供任何地方的任何人免费使用,几乎没有任何限制

你可以复制它

根据本电子书或 www gutenberg org 在线提供的古腾堡项目许可条款,将其赠送或重新使用

标题

荷马的伊利亚特

作者

本垒打

译者

安德鲁·朗

沃尔特叶

有点

和欧内斯特迈尔斯

发布日期

一月

电子书

发布日期

二月

英语

…………

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>

#define SIZE 256

int end_line(FILE *file, int c)
{
    int endLine = (c == '\r' || c == '\n');

    if (c == '\r')
    {
        c = getc(file);
        if (c != '\n' && c != EOF)
            ungetc(c, file);
    }

    return endLine;
}

int get_word(FILE *file, char *word, size_t wordSize)
{
    size_t i = 0;
    int c;

    //skip non-alpha characters
    while ((c=fgetc(file)) != EOF && !isalpha(c) && isspace(c)){
        ;   //do nothing
    }

    if (c != EOF)
        word[i++] = c;

    //read up to the next non-alpha character and store it to word
    while ((c=fgetc(file)) != EOF && i < (wordSize - 1) && isalpha(c) && !end_line(file, c))
    {
        c=tolower(c);
        word[i++] = c;
    }
    word[i] = 0;
    return c != EOF;

}

//Main Function
int main (int argc, char **argv)
{
    char *input = argv[1];
    FILE *input_file;
    char word[SIZE];

    input_file = fopen(input, "r");

    if (input_file == 0)
    {
        //fopen returns 0, the NULL pointer, on failure
        perror("Canot open input file\n");
        exit(-1);
    }
    else
    {
        while (get_word(input_file, word, sizeof(word)))
        {
            //do something with word;
            printf("%s\n", word);
        }
    }

    fclose(input_file);

    return 0;
}
4

1 回答 1

1

在 lineprintf("%s\n", word);中, the\n是一个转义序列,表示换行符。这就是换行符的来源!

至于标点后跟空格时的额外换行符,请仔细看这里:

//skip non-alpha characters
while ((c=fgetc(file)) != EOF && !isalpha(c) && isspace(c)){

注释与代码不匹配,这是可疑的。在 while() 测试中发生了如此多的事情也令人怀疑。编写如此简洁的代码是没有意义的,它只会让调试变得更加困难。无论出于何种原因,一些 C 程序员喜欢编写不可读的代码……但不要模仿他们。:)

于 2013-08-07T06:04:33.633 回答