0

编写一个程序(过滤器),从标准输入读取 ASCII 流并将字符发送到标准输出。该程序会丢弃除字母以外的所有字符。任何小写字母都输出为大写字母。以空格字符分隔的五个一组的输出字符。每 10 组后输出一个换行符。(一行的最后一组后面只有换行符;一行的最后一组后面没有空格。)最后一组可能少于五个字符,最后一行可能少于 10 个团体。假设输入文件是任意长度的文本文件。为此使用 getchar() 和 putchar()。您将永远不需要一次在内存中拥有超过一个字符的输入数据

我遇到的问题是如何做间距。我创建了一个包含 5 个对象的数组,但我不知道如何处理它。这是我到目前为止所拥有的:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
    char c=0, block[4]; 

    while (c != EOF)
    {
       c=getchar();

       if (isupper(c))
       {
           putchar(c);
       }
       if (islower(c))
       {
          putchar(c-32);
       }
    }
 }
4

2 回答 2

0

您无需存储字符即可执行问题中描述的算法。

您应该一次读取一个字符,并跟踪我不会透露的 2 个计数器。每个计数器都可以让您知道将格式化输出所需的特殊字符放在哪里。

基本上:

read a character
if the character is valid for output then
   convert it to uppercase if needed
   output the character
   update the counters
   output space and or newlines according to the counters
end if

希望这可以帮助。

另外:我不知道你试图用这个block变量做什么,但它被声明为一个由 4 个元素组成的数组,并且在文本中没有任何地方是使用的数字 4...

于 2013-02-05T17:34:37.083 回答
0
int main()
{
    char c=0; 
    int charCounter = 0;
    int groupCounter = 0;

    while (c != EOF)
    {
       c=getchar();

       if (isupper(c))
       {
           putchar(c);
           charCounter++;
       }
       if (islower(c))
       {
          putchar(c-32);
          charCounter++;
       }

       // Output spaces and newlines as specified.
       // Untested, I'm sure it will need some fine-tuning.
       if (charCounter == 5)
       {
           putchar(' ');
           charCounter = 0;
           groupCounter++;
       }

       if (groupCounter == 10)
       {
           putchar('\n');
           groupCounter = 0;
       }
    }
 }
于 2013-02-05T17:41:50.193 回答