2

私の指示:入力ストリームから文字を繰り返し(ファイルの終わりまで)読み込むプログラムを作成します。文字が大文字の場合は、小文字に変更して出力ストリームに書き込みます。他のすべての文字については、文字を変更せずに出力ストリームに書き込みます。入力にはgetchar()を使用し、出力にはputchar()を使用し、入力ファイルをプログラムに接続するには入力リダイレクトを使用します

私のプロジェクト名はInputで、テキストファイルはinput.txtです。実行すると、「Input <input.txt」と入力します。プログラムはコマンドウィンドウでそれを模倣しているだけですが、テキストファイルから読み取るにはどうすればよいですか。

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

int main()
{
  char c, x;


   c=getchar();

  while (c != EOF)
 {

    c=getchar();
     x = tolower(c);
     if (isupper(c))
    {
        putchar(x);

    }
    else 
    {
        putchar(c);

    }

 }
    system("Pause");
}
4

2 に答える 2

0

ASCIIテキストに対してのみこれを行う慣用的な方法は次のとおりです。

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


int main()
{
    int c;

    while((c = getchar()) != EOF)
        putchar(tolower(c));

    exit(EXIT_SUCCESS);
}

教科書は言うのがとても好きなので、UTF-8は読者にとって簡単な練習問題として残されています;-)

于 2013-01-30T03:04:27.227 に答える
0

問題は、プログラムにアクセスして入力したくないということだと思いますInput < input.txt。代わりに、ターミナルプログラムを開き、ディレクトリをプロジェクトを含むディレクトリに変更してから、コマンドラインから.を記述してプログラムを実行しInput < input.txtます。これにより、プログラムが起動しinput.txt、コンソールからテキストを読み取るのではなく、の内容が標準の入力ストリームとして使用されます。

そうは言っても、コードには2つのバグがあります。まず、あなたはラインを持っていることに注意してください

c = getchar();

入力の読み取りを行うループの外側。すぐに電話します

c = getchar();

再びループの内側。これは、読み込んだ最初の文字を破棄していることを意味します。

次に、ループは必要以上に1回実行されます。の2番目の呼び出しがをgetchar()返す場合EOF、現在のループの反復が終了するまでこれを検出しません。これは、チェックがループの一番上にあるためです。ループの一番上には、文字EOFを印刷するまで到達しません。EOFこれを修正するには、ループと半分のイディオムを使用して、途中でループから抜け出すことを検討してください。

for (;;) {
    /* Read data. */
    if (/* no data left */) break;

    /* Process data. */
}

if様式的には、ここにとelseブランチの両方が必要ですか?大文字でない文字の値は変更されないことを思い出してくださいtolower。したがって、大文字と小文字を1つずつ大文字にするのは冗長です。tolower特殊なケースを使わずに、作成した文字を出力するだけです。

お役に立てれば!

于 2013-01-30T01:40:08.427 に答える