0

標準入力から ASCII のストリームを読み取り、文字を標準出力に送信するプログラム (フィルター) を作成します。プログラムは文字以外のすべての文字を破棄します。小文字はすべて大文字として出力されます。スペース文字で区切られた 5 つのグループで文字を出力します。10 グループごとに改行文字を出力します。(行の最後のグループの後には改行のみが続きます。行の最後のグループの後にスペースはありません。) すべての最後のグループは 5 文字未満であり、最後の行は 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

質問で説明されているアルゴリズムを実行するために文字を保存する必要はありません。

一度に 1 文字ずつ読み取り、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 に答える