前提・実現したいこと
C言語で、EOFの使い方を調べてもよく分かりません。
下記のソースコードでは、
./tr abc def
abc
def
のように、文字の変換が正常に動作していましたが、
EOFをソースコードに加えてみると、
./tr abc def
abc
aec
のように、文字の変換が正常に動作しませんでした。
お力添えいただければ幸いです。
該当のソースコード
C言語
1 2 3ソースコード 4#include<stdio.h> 5#include<string.h> 6#include<ctype.h> 7 8int main(int argc, char *argv[]){ 9 10// 入力する文字の変数を定義 11char moji1[100]; 12int c; 13size_t i; 14size_t j; 15// 何度も文字を入力可能にする 16while( ( c = getchar() ) != EOF ){ 17putchar( c ); 18memset(moji1, 0, sizeof(moji1)); 19 20// 文字の入力 21scanf( "%c", moji1 ); 22 23// 入力した文字分だけ繰り返す 24for( i = 0; i < strlen( moji1 ); i++ ){ 25// trの変換先の文字分だけ繰り返す 26for( j = 0; j < strlen( argv[1] ); j++ ){ 27// 入力した文字と変換先の文字が同じか判定 28 if( moji1[i] == argv[1][j] ){ 29// trの変換先と変換元の文字が同じか判定 30if( argv[1][j] != argv[2][j] ){ 31printf( "%c", argv[2][j] ); 32i++; 33}else{ 34printf( "%c", moji1[i] ); 35 36} 37} 38} 39if( moji1[i] != argv[1][j] ){ 40printf( "%c", moji1[i] ); 41} 42} 43} 44return( 0 ); 45}
回答未満ですので、コメントでご案内します。とりあえずこちらをご覧ください。
[teratail - C言語EOF判定について] https://teratail.com/questions/100042
上記、本質問とは論点は違いますけれども。(違う視点と説明から見ると分かる場合もあるのでは、との期待からのご案内です)
インデントなんとかならんのか?→https://webkaru.net/clang/indent/
あと、while( ( c = getchar() ) != EOF )とputchar( c );のcが全角d^^
回答していただき、ありがとうございます!
EOFがどういうものなのかは分かりましたが、使い方がいまいちわからないです。
理解力がなくて大変申し訳ないですが、詳しく教えていただけるとありがたいです。
答えになっているのか?・・・多分に主観が入っています・・・
EOF(end of file)の考えは、もともとはUNIXで持ち込まれたものだと思います。
(UNIXでは、全ての入出力をファイルとして扱っていた→仮想化)
で、C言語はUNIXの実装言語ですから、そこから来ているのだと思います。
で、EOFの使い方ですが、ファイル(入出力)が終了したことを知らせるために、ファイル読み書き時に入力(出力)が終了したことをシステムが通知するためにEOFを返してきます。従って、EOFを検出した場合、読み込みを終了させる必要が有ります。文字の読み込みでも、行の読み込みでもEOFが帰ってきたら、(読み込み)処理を終わらせて後続の処理に移る必要が有ります。EOFはキーボード入力ならCtl-DあるいはCtl-Cで送れます。(Windowsはどうだろう?)
>cateyeさん
回答欄に書かれてはいかがでしょうか。ただ、CTRL-CはBREAKだと思います。プログラムはDOS、Windowsのコマンドプロンプト、UNIX端末でも強制終了かと。DOS/WindowsコマンドプロンプトですとCTRL-Z(0x1b)ですね。
ご助言有難うございます。・・・コメントの追加になってしまった^^;
CTRL-ZのEOF間違えました。
正:CTRL-Z 0x1a
誤:CTRL-Z 0x1b (ESC)
0x1bはエスケープシーケンス始まりでした。
回答4件
あなたの回答
tips
プレビュー