使用struct和point来输入和输出信息

时间:2013-03-31 12:51:38

标签: c++ c

我在struct中输入字符串指针时遇到问题。这是我的代码:

typedef struct{
        char *name;
        int age;      
}stu;

void allocate(stu* &s, int n){
     s = (stu*) malloc(n * sizeof(stu));
     if(s == NULL){
          printf("\nNot enought memory!");
          exit(1);
     }     
}
// Input info
void input_info(stu* &s, int n){
     void input(stu &s); //prototype
     for(int i = 0; i < n; i++){
             printf("\n-- Student #%d:", i+1);
             input(*(s+i));
     }    
}

void input(stu &s){
     fflush(stdin);
     printf("\nEnter student's name: ");
     gets(s.name);
     printf("\nEnter student's age: ");
     scanf("%d", &s.age);
}
// End input

//Output info
void output_info(stu* s, int n){
     void output(stu s); //prototype
     for(int i = 0; i < n; i++){
             printf("\n-- Student #%d:", i+1);
             output(*(s+i));
     }
}

void output(stu s){
     printf("\nName: %s", s.name);
     printf("\nAge: %d", s.age);
}
//End output

int main(){
    stu* s;
    int n;
    printf("How many students you want to input?: ");
    scanf("%d", &n);
    allocate(s, n);
    input_info(s, n);
    output_info(s, n);
    getch();
}

当我输入第二个学生的名字时,它被打破了?我分配了内存。我想问一下如何为stu指针释放内存?感谢您的阅读

2 个答案:

答案 0 :(得分:4)

在您的计划中可以并且应该改进许多事情。一些建议:

  1. 删除char *成员,将其替换为std::stringYou don't want to do manual memory management for anything unless you really want to.
  2. 放弃愚蠢的scanfprintf,它们不是类型安全Since you are using C++ use std::cin and std::cout and you are much safer than usage with later
  3. 放弃fflush(stdin),在fflush gives you undefined behavior以外的任何地方拨打stdout
  4. 在C ++中,您通常希望使用new而不是mallocAvoid using dynamic memory allocation at all, if you can。更喜欢使用std::vector

  5. <强> Online Sample
    根据上述建议,您的示例可以写成:

    #include<string>
    #include<vector>
    #include<iostream>
    
    typedef struct
    {
        std::string name;
        int age;      
    }student;
    
    // Input info
    void input_info(std::vector<student> &s)
    { 
        student obj;
        std::cout<<"\nEnter Students name";
        std::cin>>obj.name;
        std::cout<<"\nEnter Students age";
        std::cin>>obj.age;
        s.push_back(obj);
    }
    
    // Output info
    void output_info(const std::vector<student> &s)
    {
        for (auto itr = s.cbegin(); itr != s.cend(); ++itr)
        {
            std::cout<<"\nName:"<< itr->name;
            std::cout<<"\nAge:"<< itr->age;
        }
    }
    
    int main()
    {
        int n;
        std::cout<<"How many students you want to input?\n";
        std::cin>>n;
        std::vector<student>s;
        for(int i = 0; i<n; i++)
        {
            input_info(s);
        }
        output_info(s);
        return 0;        
    }
    

答案 1 :(得分:0)

正如之前的一些海报所提到的,代码不是“纯粹的”c ++,因为它混合了许多C和C ++特性。我个人认为在处理像你这样的POD结构时问题就少了。

崩溃可能是由gets()引起的。它假定char指针已经分配了合适的容量。当输入字符串长于容量时,它具有未定义的行为。你的容量为0,因此崩溃。

如果您坚持使用C函数,请参阅:Safe Alternative to gets。 否则查找getline()。