0

私は CheckEmployee という名前のこの関数を持っています。テキスト ファイルを開き、ユーザーが入力した ID がレコードに存在するかどうかを確認します。

void CheckEmployee()
{
    system("CLS");
    char empID[5];

    printf("Key in Employee ID: ");
    scanf("%s", &empID);

    FILE *fp = fopen("Employees.txt", "r");
    char lineOfText[40];

    while (fgets(lineOfText, 40, fp))
    {
        char id[6];
        strncpy(id, lineOfText, 5);
        id[5] = 0;

        if (id == empID)
        {
            printf("Hello?");
        }
    }
    fclose(fp);
}

texfile には次のものが含まれます。

E0001de Guzman, Franz Miguel C.         
E0002de Guzman, Fernan Ralph C.         

空白を含めて各行 40 文字。問題は:

  1. 4 回ループします(whileたどるレコードが 2 つしかないため、2 回だけにする必要があります)。
  2. プログラムの で実行時エラーが発生しましたif (id == empID)。しかし、それを に置き換えるとif (strcmp(id, empID) == 0)、答えは false になります。

更新strcmp現在機能しています。@barak manos に感謝します。4 回のwhileループはまだ続きますが、必要な結果が得られます。

4

3 に答える 3

2

まず、char empID[5]andchar id[6]は、あなたの入力に対して疑わしいほど短いように見えます。

id == empID第 2 に、本質的に静的に割り当てられた 2 つの配列のメモリ アドレスを比較しているため、式の値は常に false です。

および配列が、読み込んでいるテキストを格納するのに十分な大きさであると仮定すると、式strcmp(id,empID) == 0は探している結果を生成するはずです。idempID

、、、などの文字列ルーチンは、null で終わる文字列を入力として想定していることに注意しstrcmpてください。したがって、その目的で使用される各配列が、入力テキストと追加の文字を格納するのに十分な大きさであることを確認する必要があります。strcpystrlenprintfchar\0

于 2014-09-20T17:23:13.813 に答える
1

strcmp()文字列を比較するために使用する必要があります。2 つの変数が同じアドレスを持っているかどうかを比較していますが、そうではありません。

null ターミネータempIDを保持するのに十分な長さではないことに注意してください。E0001配列のサイジングは一貫している必要があります。ラインのストリングの長さ 40 も危険なほど小さいです。行のサイズにはおそらく 4096 を使用し、表示された行が実際に 39 または 40 よりも長い場合は文句を言うでしょう。配列のサイズを指定するために を使用fgets(lineOfText, sizeof(lineOfText), fp)することもお勧めです。sizeofこれは、配列のサイズを変更したい場合、コードを 1 行変更するだけでよいことを意味します — それは配列の宣言です。

于 2014-09-20T17:24:12.987 に答える
0

あなたはこのようにする必要があります:

 while (fgets(lineOfText, 40, fp))
    {
        char id[6];
        strncpy(id, lineOfText, 5);

        id[5] ='\0';  // add null to end of id.

        if (strcmp(id,empID)==0) // here compare string
        {
            printf("Hello?");
        }
    }
于 2014-09-20T18:04:33.190 に答える