0

わかりましたので、それを修正すると、提示可能でいくつかの提案が表示され、同じエラーが発生します(コードブロックbtwを使用しています)、理由を示さずにクラッシュするだけのエラーです。これで2番目のエラーが発生しました。年齢が入力された後のgetinfo関数では、性別を取得するステートメントを出力し、入力せずに他の人の名前を取得するステートメントを出力します(その部分をスキップするようです)

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

void getinfo (char* nam[],int ag[], char gender[], int count){
 int y;
 for(y = 0; y < count; y++){
 nam[y] = malloc(30);
 printf ("What is the student's name?\t");
 scanf ("%s", &nam[y]);
 printf ("\nWhat is the students age?\t");
 scanf ("%d", &ag[y]);
 printf ("\nwhat is the students gender, M/F:\t");
 scanf ("%c", &gender[y]);
  }
 }

void findeldest (char* nam[],int ag[], char* gender[], int count){
 int largest = 0, y, eldest =0 ;
 for(y = 0; y < count; y++){
    if (ag[y] > eldest){
        largest = ag[y];
        eldest = y;
        }
    }
    printf ("The eldest student is:\t%s", nam[eldest]);
    printf ("\nGender:\t%c", gender[eldest]);
    printf ("\nWith an age of:\t%d", ag[eldest]);

}


int main (){
  int amount, y;
  printf("How many students are you admitting?\t");
  scanf ("%d", &amount);
  if (amount > 50){
  printf("Too many students!");
   }else{
   char *name[50];
   int age[50];
   char gender[50];
   getinfo(name, age, gender, amount);
   findeldest(name, age, gender, amount);
   system("pause");
  }
}
4

2 に答える 2

3

提供されたコードはコンパイルできないため、問題を正しく診断できません。問題を再現するために最低限必要なものだけを含むコンパイル可能なテストケースで投稿を更新してください。

if (ag[y] > eldest){
    largest = ag[y];
    eldest = y;
    } /* <--- Note the inconsistent indentation.
       *      Do you want us to read your code and help you?
       *      If so, please fix your indentation.
       */

おそらく年齢に関する比較があり、次に年齢変数へのインデックスの割り当てがありますか? 最も古いストアはどれですか? インデックス、または年齢?選択して、一貫性を持たせてください。おそらく、「eldest_index」や「eldest_age」など、よりわかりやすい識別子を使用することをお勧めします。これにより、「eldest_index」が最年長者の配列インデックスであり、「eldest_age」が最年長者の年齢であるという内部文書が提供されます。最大の店舗が古くなっているように見えるので、おそらくコードは次のようになります。

if (ag[y] > largest){
    largest = ag[y];
    eldest = y;
}

printf ("\nGender:\t%c", gender[eldest]);最年長がインデックスではなく年齢を格納する場合、これによりプログラムがクラッシュすることはありませんeldest >= 50か? より良い識別子を考え出すと、このステートメントはより意味のあるものになると思います。さらに、gender[eldest]is achar *であり、%cprintf にint文字値を持つ を期待するように指示します。


edit : scanfを使用する前にこの scanf マニュアルを読んでいれば、2 番目のエラーに遭遇することはなかったでしょう。実際、ドキュメントを読む前に scanf を使用するの間違いです。停止してください。

printf("The character entered for gender has an integer value of %d\n", (unsigned char) gender[y]);の後に置くとscanf ("%c", &gender[y]);、どのような値が得られますか? 「\n」は有効な性別ですか?

...ユーザーが整数の読み取りと文字の読み取りの間にEnterキーを押したときに発生する問題を修正しました。すごい!マニュアルを読まないと、3 つ目の問題が発生します。ユーザーが 'M' または 'F' を押してから Enter を押したとします。これにより、'M' または 'F' が標準入力から読み込まれますscanf ("%c", &gender[y]);が、'\n' は標準入力に残ります。その効果は何ですか?ループが繰り返され、scanf に次の空白文字(「%s」が示すもの) まで読み取るように指示すると、名前が空白になります! おっと!

ユーザーが性別を入力する前後にEnterキーを押すと想定すると、次のように変更することをお勧めscanf ("%c", &gender[y]);します。

int c;
for (c = getchar(); c >= 0 && c != '\n'; c = getchar());  /* Discard the remainder of the line,
                                                           * so that it doesn't interfere with
                                                           * the gender input.
                                                           */
gender[y] = c;
for (c = getchar(); c >= 0 && c != '\n'; c = getchar());  /* Discard the remainder of the line,
                                                           * so that it doesn't interfere with
                                                           * the next scanf call.
                                                           */

... そしてその scanf マニュアルを注意深く読むことを忘れないでください!

于 2013-03-09T04:35:49.180 に答える
1

あなたは getinfo 関数のソース コードを投稿していないので、ここでできる最善のことは推測です。私が最初に確認する場所は、'nam' および 'gender' パラメーターを入力するときの getinfo です。それらにはスタックローカル文字列を使用している可能性が最も高いです。「getinfo」関数が戻ると、これらの文字列は存在しなくなります。ただし、スタック上のこれらの場所へのポインターはまだ存在し、findeldest が printf でそれらのポインターを使用しようとするたびに、スタックからガベージを出力します。

「getinfo」実装を提供すると、これはより簡単になります。これが私の実装です

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

void findeldest (char* nam[],int ag[], char* gender[], int count){
  int largest = 0, y, eldest =0 ;
  for(y = 0; y < count; y++){
    if (ag[y] > eldest){
      largest = ag[y];
      eldest = y;
    }
  }
  printf ("The eldest student is:\t%s", nam[eldest]);
  printf ("\nGender:\t%s", gender[eldest]);
  printf ("\nWith an age of:\t%d", ag[eldest]);

}

void getinfo(char* nam[],int ag[], char* gender[], int count)
{
    static const char * const MALE = "male";
    static const char * const FEMALE = "female";

    static const char * const BRIAN = "brian";
    static const char * const SUE = "sue";
    static const char * const DAVE = "dave";
    static const char * const APRIL ="april";



    for(int i = 0 ; i < count ; ++i)
    {
        ag[i] = i;

        switch(i%4)
        {
            case 0:
                nam[i] = BRIAN;
                break;
            case 1:
                nam[i] = SUE;
                break;
            case 2:
                nam[i] = DAVE;
                break;
            case 3:
                nam[i] = APRIL; 
                break;

        }

        switch(i%2)
        {
            case 0:
                gender[i] = MALE;
                break;
            case 1:
                gender[i] = FEMALE;
                break;
        }

    }
    return;
}

int main (){
  int amount, y;
  printf("How many students are you admitting?\t");
  scanf ("%d", &amount);
  if (amount > 50){
    printf("Too many students!");
  } else {
    char *name[50];
    int age[50];
    char *gender[50];
    getinfo(name, age, gender, amount);
    findeldest(name, age, gender, amount);
    system("pause");
  }
}

それは私にとってはうまくいきます。findeldest の 2 番目の「printf」ステートメントが修正されていることに注意してください。%s (ヌルで終了する文字列) の意味で %c (1 文字) を使用していました。

また、C90 準拠のコードを使用していません。投稿するときは、使用しているコンパイラと、これをコンパイルするために必要なオプション (存在する場合) を指定する必要があります。有効な C99 コードに近いようです。「getinfo」実装での const の誤用に関するコンパイラ警告がいくつか表示されます。

于 2013-03-09T04:42:42.577 に答える