2

我是指针的新手,并试图使用指向结构的指针。但是在第一次进入之后,我的程序崩溃了。请帮助我。

这是结构定义:

struct students{//structure students definition
   char name[20];
   char RegNo[15];
   char CourseUnit[10];
   int score;
   char grade;
};

成绩不应该由用户输入,而是由程序计算。

到目前为止,这是我编写的代码:

int main()//start of main
{
    struct students *myStudPtr,myStud[SIZE];

    myStudPtr=&myStud[SIZE];

    int i;//declare variables
    int count;

    printf("How many students do you want to deal with?\n");
    scanf("%d",&i);//number of entries

    for(count=1;count<=i;count++) {
        printf("Enter student's name\n");
        scanf("%s",&(*myStudPtr).name);

        printf("Enter the student's registration number\n");
        scanf("%s",&(*myStudPtr).RegNo);

        printf("Enter the course unit\n");
        scanf("%s",&(*myStudPtr).CourseUnit);

        printf("Enter the marks scored\n");
        scanf("%d",&(*myStudPtr).score);
    }

    printf("NAME\tREGISTRATION\t\tCOURSE UNIT\tSCORE\t\tGRADE\n");//tabulates the output
    printf("%s\t", myStudPtr->name);
    printf("%s\t\t", myStudPtr->RegNo);
    printf("%s\t", myStudPtr->CourseUnit);
    printf("%d\t\t", myStudPtr->score);

    if(myStudPtr->score>100) {
        printf("Invalid\n");
    } else if(myStudPtr->score<40) {
        printf("FAIL\n");
    } else if(myStudPtr->score<50) {
        printf("D\n");
    } else if(myStudPtr->score<60) {
        printf("C\n");
    } else if(myStudPtr->score<70) {
        printf("B\n");
    } else if(myStudPtr->score>70) {
        printf("A\n");
    } else {
        printf("Invalid");
    }

    return 0;
}

请协助。在此先感谢。

4

1 回答 1

9

您有一个index-out-of-bound错误导致运行时未定义的行为:

myStudPtr = &myStud[SIZE];
//                  ^^^^^ 
//                  wrong 

根据声明struct students myStud[SIZE];,最大指标值可以SIZE - 1。记住数组索引以0.

编辑

据我所知,您已经声明了一个结构数组,并希望i使用指向结构的指针从用户那里读取学生信息的数量。但是您的代码中还有一些问题,例如在 for 循环中,您总是访问相同的结构元素:

for(count = 1; count <= i; count++)
    scanf("%s", &(*myStudPtr).name);
//                  ^   
//                  points to same struct element in array

这个错误出现在每个scanf()andprintf()语句中。

正确的将如下:

  1. 初始化指向数组中第一个元素地址的指针:

     myStudPtr = &myStud[0];
     //                  ^ first element at 0th index 
    
  2. 通过指针,您可以通过以下两种方式中的任何一种简单地访问结构的元素:

    首先:例如扫描score学生的价值:

    scanf("%d", &myStudPtr[count].score);
    

    注意: “数组下标运算符”的优先级高于“通过对象名称运算符选择成员”,因此您不需要括号。运算符的优先级也高于& 运算符,因此即使您不需要任何括号来获取地址(例如不需要)。[].().&&(myStudPtr[count].score)

    第二score:使用指针和运算符扫描学生的值->

    scanf("%d", &(myStudPtr + count)->score);
    

    注意+加号运算符的优先级较低,因此我们需要括号来覆盖优先级。->并且通过指针运算符选择成员的优先级高于&& 运算符,因此在这里您也不需要任何括号,例如&((myStudPtr + count)->score).

重要注意事项:

  1. 您应该检查i用户输入的值,该值必须小于SIZE(strcut 数组的大小),否则您的代码中可能会有未定义的行为。

  2. 要读取字符串,请使用安全fgets()函数而不是 scanf 以避免缓冲区溢出。阅读:“阅读使用scanf()不好的一行?”

另一个旁注:

  1. 作为新的 C 程序员(我觉得)你应该阅读:Indenting C Programs这是一个学习缩进练习的快速教程。

  2. 您应该始终在之后保留空间,并使;代码可读,出于同样的原因,类似的表达式count<=i 应该写为count <= i. 比较你的 for 循环:

     for(count=1;count<=i;count++)
    

    在此之后,我想建议您:

     for(count = 1; count <= i; count++){
         // code after one tab
     }  
    

改进代码:

我还想建议您改进 if-else 编码风格,您的 if-else 部分代码可以编写如下:

score = myStudPtr->score;
if(0 <= score && score <= 100){
  if(score > 70)
    printf("A");
  if(60 <= score && score < 69)
    printf("B");    
  if(50 <= score && score < 59)
    printf("C");    
  if(40 <= score && score < 49)
    printf("D");    
  if(score < 40)
    printf("FAIL");
}
else
 printf("Error: Invalid Entry!");
printf("\n");
  • 我删除了许多else语句,而是使用 &&。
  • 删除了多余{..}的大括号对。
  • 使用局部score变量myStudPtr->score来保持代码看起来简单。
  • \n从每个pritf语句中删除,而不是在末尾添加一个新语句(printf不是很重要)。

最后一个错误:

要打印每个学生记录,您需要在其中调用printf()函数并包含 if-else 逻辑来评估学生成绩的新循环。

于 2013-08-15T14:17:23.390 回答