【问题标题】:Read a file of unknown size/length, strip non-alphabetic chars, and change uppercase to lower [closed]读取未知大小/长度的文件,去除非字母字符,并将大写更改为小写 [关闭]
【发布时间】:2017-01-11 14:35:57
【问题描述】:

然后它必须打印到屏幕上,每行 80 个字符。

这是在 c 中完成的。

我的编码很弱,不知道从哪里开始。

感谢任何帮助

【问题讨论】:

  • '不知道从哪里开始。' => 首先尝试从文件中读取数据,有 加载 示例说明如何执行此操作
  • 这是一个基本的编程问题,而不是一个特定解决方案的特定问题。谷歌是你的朋友。查看如何从文件中读取,如何输出到屏幕等。
  • @BLUEPIXY:我认为没有理由为此使用strtok。这是一个简单的过滤器,不需要上下文。
  • @Olaf 这是一个简单的过滤器当然:-)。

标签: c arrays uppercase lowercase alphabetic


【解决方案1】:

鉴于需要将大写变为小写,需要:

#include <ctype.h>

对于tolower() 函数和isalnum() 函数

............

从文件中输入字符,由于每个字符都需要处理,所以需要:

#include <stdio.h>

对于函数:getchar() 和对于 EOF 的定义和对于函数:putc()

......

要计算当前行显示的字符数,需要:

size_t lineLen = 0;

.......

要知道何时转到下一个输出行需要那个数字 80

#define MAX_LINE_LEN (80)

…………

如果命令行包含:

myprogram < inputFile.txt

那么就不需要在程序中打开/关闭文件了。

...........

当然,需要一个不带参数的main() 函数:

int main( void )
{
...
} // end function: main

…………

由于我们将阅读大量字符,一次一个,因此需要:

以下while() 语句已编辑,因此可以处理任何输入字符。

int ch;
while( (ch = getchar()) != EOF )
{
...
}

........

由于只显示可打印字符,因此需要如下一行:

if( isalnum( ch ) )
}
....
}

.......

由于仅以小写显示需要这样一行:

ch = tolower( ch );

............

需要实际输出char,并跟踪行长

putc( ch );
lineLen++;

............

需要在 80 个字符后输出一个新行并重置计数器

if( MAX_LINE_LEN >= lineLen )
{
    lineLen = 0;
    putc( '\n' );
}

............

遇到EOF 后,需要输出一个最终的换行符,以便显示所有字符

putc( '\n' );

............

这就是它的全部内容。

【讨论】:

  • while( (ch = getchar()) &amp;&amp; EOF != ch ) 停止 while 循环应该 ch 的值为 0 或 EOF。这是你的意图吗?
  • "遇到EOF后,需要输出一个最终的换行符" --> 只有lineLen &gt; 0才需要打印;
  • @chux,如果输入文件是文本文件,那么输入字符永远不会是0x00,这样就不会有问题了。但是,我同意要打印零字符的“罕见”情况;输出最终的换行符不会受到伤害,并且 OP 始终可以添加对零字符的检查。我没有尝试为 OP 编写程序,只是让 OP 朝着正确的方向开始。
  • 不错的答案是不要全部放弃。细节:C 没有定义/限制文本文件的内容,所以“如果输入文件是文本文件,那么永远不会有 0x00 的输入字符”听起来更像是意见而不是 C 事实。
  • @chux,我修改了while()语句,让它可以输入任何字符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 2012-01-03
  • 2013-02-04
  • 2017-10-26
  • 2019-07-20
  • 2021-03-30
  • 2014-11-30
相关资源
最近更新 更多