c-user输入中的结构数组

时间:2016-01-08 13:40:24

标签: c

我是编程方面的新手,尤其是beforeDestroy: function(borrow, next){ return Book.find({id:borrow.product}) .then(function(){ Book.update(borrow.product, {'isBorrowed' : false}) }) .then(function(){ next(); }) .catch(function(error){ next(error); }); } 。 我正在尝试编写一个使用结构数组的程序,但是如果该结构包含字符串,我遇到了问题。 在用户给出最后一个输入后,编译器会以某种方式崩溃。

下面的结构只是一个只包含一个项目的简化版本,因为问题似乎是将字符串读入数组。 非常感谢任何帮助,在此先感谢。

C

2 个答案:

答案 0 :(得分:6)

在输入scanf("%s" , all[i].name);之前,您需要将内存分配给all[i].name

一个例子 -

for(i=0;i<size;i++)
{
    all[i].name=malloc(20*sizeof(*(all[i].name)));
    if(all[i].name!=NULL){
       printf("enter name\n");
       scanf("%19s" , all[i].name);
    }
}
//use these strings
for(i=0;i<size;i++){
       free(all[i].name);                  //free the allocated memory 
}
free(all);
在您的结构中

而不是char *,将name声明为char数组(如果您不想使用动态分配) -

typedef struct{
  char name[20];                     //give any desired size
 }student;
/*           no need to free in this case   */

答案 1 :(得分:0)

没有为学生姓名(char* name)分配内存,因此在尝试scanf指向该指针时,会访问无效内存并导致程序崩溃。

最简单的方法是将name声明为数组:char name[28];

如果在为malloc()分配内存时出现问题,则需要检查students的返回值,这将返回NULL pointer。最后,需要使用free()释放分配的内存。

例如:

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

typedef struct {
    char name[28];
    unsigned int age;
} student;

int main()
{
    size_t size = 0;
    printf("\nEnter number of entries: ");
    scanf("%zu", &size);
    // add some check for size

    student* students = (student*)malloc(size * sizeof(student));

    if (students == NULL) {
        printf("\nProblem with allocating memory:\n"
               " - size: %zu\n"
               " - total size needed: %zu\n",
               size, size * sizeof(student));
        return 0;
    }

    for (size_t i = 0; i < size; ++i) {
        printf("Enter name: ");
        scanf("%27s", students[i].name);
        printf(" Enter age: ");
        scanf("%u", &students[i].age);
    }

    printf("\nList of students:\n");

    for (size_t i = 0; i < size; ++i) {
        printf("%s (%u)\n", students[i].name, students[i].age);
    }

    free(students); // free the allocated memory

    return 0;
}