找到最年长的时候代码崩溃(编辑)

时间:2013-03-09 04:18:10

标签: c crash

好吧所以如果把它固定起来而且它表现出来我做了一些建议并且我得到了同样的错误(即时通讯使用了代码bbw),它的错误只是崩溃而没有给出理由。我有第二个错误。在输入年龄后的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");
  }
}

2 个答案:

答案 0 :(得分: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]char *,其中%c告诉printf期望int具有字符值。


编辑:如果您在使用scanf之前阅读了this scanf manual,则不会遇到第二个错误。事实上,在阅读文档之前使用scanf 是你的错误;请停止。

如果您在printf("The character entered for gender has an integer value of %d\n", (unsigned char) gender[y]);之后放置scanf ("%c", &gender[y]);,您会得到什么价值? '\ n'是有效的性别吗?

...所以你已经解决了当用户在整数读取和字符读取之间按下输入时发生的问题。大!没有阅读手册,你就遇到了第三个问题。假设用户按“M”或“F”,然后输入。这将导致'{1}}从stdin读取'M'或'F',但'\ n'将保留在stdin上。那有什么影响?当循环重复时,你告诉scanf读取但不包括下一个空格字符(这是'%s'表示的内容),你最终会得到一个空白名字!哎呀!

假设您希望用户在输入性别之前和之后按输入,我建议您将scanf ("%c", &gender[y]);更改为:

scanf ("%c", &gender[y]);

...不要忘记阅读scanf手册,小心

答案 1 :(得分:1)

你没有发布getinfo函数的源代码,所以我们在这里做的最好的就是猜测。我看的第一个地方是getinfo,当它填充'nam'和'gender'参数时。您最有可能使用堆栈本地字符串。一旦'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中第二个'printf'语句的更正。当你的意思是%s(空终止的字符串)时,你使用的是%c(单个字符)。

此外,您没有使用符合C90的代码。发布时,您应指定要使用的编译器以及进行此编译所需的选项(如果有)。它似乎接近有效的C99代码。我在'getinfo'实现中得到了一些关于误用const的编译器警告。