-1

このプログラムは、次のことを行うことになっています。

主要な詳細を追加

大学の詳細を追加

大学に専攻を追加

主な費用の更新

専攻を探す

メイン関数を完了する前に、問題に直面しています:

関数で get の代わりに scanf を使用すると、前の質問に入力せずに 2 つの質問が表示されます。例: 大学の名前を入力してください: 大学の住所を入力してください: そして、gets を使用すると、同じ問題に直面しました。

他に間違いがあれば教えてください

前もって感謝します!

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

//Define Structures
typedef struct {
    char name[30];
    char department[30];
    int nb_students;
    int credits;
    float cost;
    char adv_name[15];
}Major;
typedef struct {
    char name[50];
    char address[30];
    Major uni_majors[50];
    int nb_majors;
}University;

// Define Functions Prototypes
Major majors_function();
University university_function();
void AddMajor(Major *major,University *university);
University UpdateMajor(char nameMajor[], University U, float newCost);
void SearchMajor(Major major,University university);

int main(int argc, const char * argv[])
{
    Major new_major;
    University new_university;

    new_major = majors_function();
    new_university = university_function();


    return 0;
}

// Fills The Major Details Function
Major majors_function() {

    Major major;

    printf("Enter Major name: ");
    gets(major.name);

    printf("Enter Department name: ");
    gets(major.department);

    printf("Enter number of students: ");
    scanf("%d",&major.nb_students);

    printf("Enter number of credits: ");
    scanf("%d",&major.credits);

    printf("Enter the cost of credit: ");
    scanf("%f",&major.cost);

    printf("Enter the Advisor's Last Name: ");
    scanf("%s",major.adv_name);

    return major;
}

// Fills the university details Function
University university_function() {
    University university;



    printf("Enter university's name: ");
    gets(university.name);

    printf("Enter university's address: ");
    gets(university.address);

    printf("Enter number of majors in this univeristy: ");
    scanf("%d",&university.nb_majors);


    return university;
}

// Adds Major to a university
void AddMajor(Major *major,University *university) {

    university->nb_majors = 0;
    if(university->nb_majors <50) {
        university->uni_majors[university->nb_majors] = *major;
    }
    else
        printf("No Available space");

    university->nb_majors++;


}

// Update Major's Cost
University UpdateMajor(char nameMajor[], University U, float newCost) {

    if(strcmp(nameMajor,U.uni_majors->name)) {
        U.uni_majors->cost = newCost;
    }
    return U;
}

// Searches for a major in a university
void SearchMajor(Major major,University university) {
    if(strcmp(university.uni_majors->name,major.name))
        printf("The total cost of this major is %.2f",(major.cost*major.credits));
    else
        printf("There is no such major!");
}
4

2 に答える 2

2

scanf文字列や文字のスキャンに使用する場合。先頭の空白 (改行など) をスキップしたい場合があります。scanfこれは、次のように、書式コードの前に単一のスペースを追加して、空白をスキップするように要求することで簡単に実行できます。

scanf(" %s",major.adv_name);
/*     ^      */
/*     |      */
/* Note space */

scanfおよびその兄弟の詳細については、このリファレンス ページなどを参照してください。

于 2013-11-08T09:35:49.323 に答える
0

決して決して使わgetsないことは決して決して決してないことは決してありません。1999 年の標準で廃止され、2011 の標準から削除されました。これ、プログラムに重大な障害点をもたらします。fgets代わりに使用してください:

fgets( major.name, sizeof major.name, stdin );

戻り値をチェックして、成功したことを確認します。

または、 を使用することもできますscanfが、変換指定子で最大バッファ サイズを指定する必要があります。

scanf( "%29s", major.name ); // leave 1 space for the 0 terminator

これに関する唯一の問題は、サイズをハードコーディングする必要があることです。のように引数として渡すことはできませんprintf。または、次のように、実行時にフォーマット文字列を作成できます。

char fmt[5]; // good for %0s to %99s
sprintf( fmt, "%%%zus", sizeof major.name );
...
scanf( fmt, major.name );

率直に言ってfgets、数値入力を含むすべてに使用する方がよいでしょう。

char inbuf[10];
char *chk;

// Read the number of students as text, then convert with the
// strtol library function; allows us to catch and reject
// non-numeric input. 
printf( "Enter number of students: " );
fflush( stdout );
if ( fgets( inbuf, sizeof inbuf, stdin ) != EOF )
{
  int tmp = (int) strtol( inbuf, &chk, 10 );
  if ( isspace( *chk ) || *chk == 0 )
  {
    major.nb_students = tmp;
  }
  else
  {
    fprintf( stderr, "%s is not a valid number\n", inbuf );
  }
}
于 2013-11-08T15:30:19.507 に答える