我正在学习C语言和系统编程。我正在尝试阅读文本文件并以小写字母打印出来。所有非字母字符都将是分隔符。我得到下面的输出。有人可以看看我的代码并给我一些关于如何删除单词之间的界限的提示吗?谢谢!
以下是我的文字文件的开头:
荷马的伊利亚特的古腾堡电子书,荷马,
这本电子书可供任何人免费使用 几乎没有任何限制。你可以复制,赠送或 根据项目Gutenberg许可证的条款重新使用它 使用此电子书或在线访问www.gutenberg.org
标题:荷马的伊利亚特
作者:荷马
译者:Andrew Lang,M.A。,Walter Leaf,Litt.D。和Ernest Myers,M.A。发布日期:2012年1月14日[电子书#3059] 发布日期:2002年2月
语言:英语
以下是我的输出: 该 项目 古滕贝格 电子书 的 该 伊利亚特 的 全垒打
通过 全垒打
此 电子书 是 对于 该 使用 的 任何人 随地 在 没有 成本 和 同 几乎 没有 限制 任何
您 可以 复制 它
给 它 远 要么 回覆 使用 它 下 该 条款 的 该 项目 古滕贝格 执照 包括 同 这个 电子书 要么 线上 在 万维网 古滕贝格 有机
标题
的 伊利亚特 的 全垒打
作者
本垒打
翻译
安德鲁 郎
米 一个
沃尔特 叶
LITT d
和 欧内斯特 迈尔斯
米 一个
过帐 日期
一月
电子书
释放 日期
二月
语言
英语
..........
这是我的代码:
#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;
}
答案 0 :(得分:1)
在第printf("%s\n", word);
行中, \n
是表示换行符的转义序列。这就是换行符的来源!
对于标点符号后跟空格的额外换行符,请仔细查看:
//skip non-alpha characters
while ((c=fgetc(file)) != EOF && !isalpha(c) && isspace(c)){
评论与代码不符,这是可疑的。同样怀疑在while()测试中发生了太多事情。编写这样简洁的代码毫无意义,它只会让调试变得更难。无论出于何种原因,一些C程序员喜欢编写不可读的代码......但不要模仿它们。 :)