タイピングの入力判定が分かりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
初心者x

タイピングの入力判定が分かりません

#1

投稿記事 by 初心者x » 15年前

とりあえず、CUI環境で作っていくところからはじめようと思っています。
よろしくお願いします。
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<ctime>
using namespace std;


int main()
{
    FILE *fp;                                        //ファイルポインタ
    char datafile[/url] = "word1.txt";                    //出力する問題
    char outtxt[256];
    char buff[1024];

    if((fp = fopen(datafile, "r")) == NULL) {
        printf("ファイルオープンエラー\n");
        exit(1);
    }

    while(fgets(buff, sizeof buff, fp) != NULL) {    //出力
        sscanf(buff, "%s", outtxt);
        printf("%s\n", outtxt);
    }

    FILE *gp;
    clock_t start, end;
    double jikan;
    char d[512];                            //入力と出力を行う変数
    char c[512];
    int i;

    cout << '\n' << "半角で入力してください\n";
    start = clock();
    
    if((gp = fopen("word2.txt", "r")) == NULL) {
        cout << "ファイルオープンエラー\n";
        exit(1);
    }
    
    do{ fgets(c, 80, gp);          /問題の部分と考えています/
        for(i=0; i<80; i++){
        cin >> d; 
        if(c == d) cout << c;
        else exit(1);
        }
    }while(c != NULL);
    

    end = clock();
    jikan = (double)(end-start) / CLOCKS_PER_SEC;
    jikan = jikan/60;
    double y;
    double z;
    z = modf(jikan, &y);
    z = z*60;

    cout << "\n経過時間は" << y << "分" << z << "秒です" << '\n';
    fclose(fp);
    fclose(gp);

    return 0;
}

初心者なのでこんな感じになってしまったのですが、
入力判定のところで迷っています。
一文字ずつ打っていかなければいけないのでしょうか?
もしよければ、ヒントだけでも教えていただければもう一度勉強しなおします。

Mist

Re:タイピングの入力判定が分かりません

#2

投稿記事 by Mist » 15年前

> 一文字ずつ打っていかなければいけないのでしょうか?

質問の意図がちょっと不明確です。
このソフトの仕様次第=あなたはどうしたいのか?、によります。

あと、不具合があるので指摘しておきます。

> }while(c != NULL);

この時のcはc[512]の先頭アドレスを表すので絶対にNULLになることはありません。

バグ

Re:タイピングの入力判定が分かりません

#3

投稿記事 by バグ » 15年前

Windowsならば、conio.hをインクルードして、_kbhit関数を使えば、キー入力の有無を取得できます。

初心者x

Re:タイピングの入力判定が分かりません

#4

投稿記事 by 初心者x » 15年前

誠に申し訳ありません。
>一文字ずつ打っていかなければいけないのでしょうか

といった意味は、コマンドプロンプトの画面上で、タイピングした際に
打った文字と答えが合っていたら出力をする、ということを処理するにはどうしたらいいでしょうか。
という意味です。

また、不具合のご指摘ありがとうございました。

環境としてはborland c++ compiler5.5を使っています。

conio.hをインクルードできるみたいなので、_kbhit関数を使ってもう一度考えてみようと思います。

出直してきます。

Mist

Re:タイピングの入力判定が分かりません

#5

投稿記事 by Mist » 15年前

> 打った文字と答えが合っていたら出力をする、ということを処理するにはどうしたらいいでしょうか。

さらに質問ですが、今のプログラムを見ると
一文字入力してもらう

一文字判定して

マッチならその文字を出力。(意味ないような気もするが)→文字入力に戻る
アンマッチならプログラム終了

となっていますね。
これを

文字列を入力してもらう。(文字数不定)

文字列全体で判定する

としたい、ということでしょうか?
であれば、strcmp使えばすぐ解決するような気もします。(質問の意図読み違えているかも)
画像

Mist

Re:タイピングの入力判定が分かりません

#6

投稿記事 by Mist » 15年前

ソース

while (fgets(c, 80, gp) != NULL) {
cin >> d;

if (!strcmp(c, d)) {
// 正解した場合の処理を書く
} else {
// 失敗した場合の処理を書く
}
}

初心者x

Re:タイピングの入力判定が分かりません

#7

投稿記事 by 初心者x » 15年前

Mistさんありがとうございました。
無事解決致しました。

while(fgets(c, 80, gp) != NULL){
        cout << c << "\n";
        cin >> d;
        if((!strcmp(c, d)) && (c != NULL)){
            cout << '\a';
        } else if(c == NULL) { break;
        } else {
            cout << "アウチ"; exit(1);
        }
実は、これは最初に言っておくべきだったのかもしれませんが、
最終的には、visualC++で作りたいと考えています。
勉強することは山ほどあり、道のりは遠いかもしれませんが、これを最初の一歩として、
やっていきたいです。
また、kbhitについても調べてみようと思います。
ではまたお勉強してきます^^

Mist

Re:タイピングの入力判定が分かりません

#8

投稿記事 by Mist » 15年前

どうしcをNULLと比較したがるんだろう??
エスパーで推測してcに文字列が入ってない場合を想定しているのであれば、fgetsでチェックしているからありえない。(改行のみって事はあるかもしれないけど)
で、文字終端はNULLではなく'\0'。
fgetsの動作と、文字列についてもうちょっと勉強したほうがいいかもしれません。

初心者x

Re:タイピングの入力判定が分かりません

#9

投稿記事 by 初心者x » 15年前

申し訳ありません。
fgetsはEOFになったら、NULLを返すとあったもので、つい。。。

もっと復習してきます。。

閉鎖

“C言語何でも質問掲示板” へ戻る