Структура C со многими проблемами [char array] - PullRequest
0 голосов
/ 25 сентября 2010

У меня есть структура со многими массивами символов, как это (и это работает):

struct maytinh {
    char tenmay[10];
    char mamay[10];
    char test[10];
    float manhinh;
    int gia;
};

Но если это так,

struct maytinh {
    char tenmay[99];
    char mamay[99];
    char test[99];
    float manhinh;
    int gia;
};

, он ломается, когда я компилирую и сканируюданные в. Более того, когда я помещаю другой массив в структуру, он также ломается:

struct maytinh {
    char tenmay[10];
    char mamay[10];
    char test[10];
    char test2[10];
    float manhinh;
    int gia;
};

Почему?(Я компилирую с c-free 4.0)

Вот код scanf:

void main() {
    int n,i;
    printf("input :");
    scanf("%d",&n);
    struct maytinh a[n];
    for (i=1;i<=n;i++) {    
        printf("May tinh so: %d\n",i);
        printf("Nhap ten may :");
        scanf("%s",a[i].tenmay);
        printf("Nhap ma may :");
        scanf("%s",a[i].mamay);
        printf("Nhap test :");
        scanf("%s",a[i].test);
        printf("Nhap kich thuoc man hinh:");
        scanf("%d",&a[i].gia);
    };
}

этот код полностью работает с первой структурой.Вот мое исправление для массива структуры динамического размера с помощью malloc () и typedef (только для таких, как я, нуждающихся):

typedef struct maytinh {
    char tenmay[99];
    char mamay[99];
    char test[99];
    char test3[99];
    float manhinh;
    int gia;
};
void main(){
    int n,i;
    printf("input :");
    scanf("%d",&n);
    maytinh *a;
    a=(maytinh*)malloc(n*sizeof(maytinh));
    for (i=0;i<=n;i++) {    
    printf("May tinh so: %d\n",i);
    printf("Nhap ten may :");
    scanf("%s",a[i].tenmay);
    printf("Nhap ma may :");
    scanf("%s",a[i].mamay);
    printf("Nhap test :");
    scanf("%s",a[i].test);
    printf("Nhap kich thuoc man hinh:");
    scanf("%d",&a[i].gia);
    };
}

Ответы [ 4 ]

2 голосов
/ 25 сентября 2010

Моим первым предположением будет то, что он не может выделить более крупные структуры, потому что вы размещаете их в стеке, а не с помощью malloc (), хотя я должен увидеть больше примеров кода, чтобы сказать наверняка.

Редактировать: похоже, мое предположение было правильным.Вы используете нестандартное расширение C, используя неконстантное число для выделения массива.Бьюсь об заклад, если вы замените это на соответствующий malloc звонок, ваша проблема будет исправлена.

1 голос
/ 25 сентября 2010

Массивы начинаются с 0 в C

  for (i=1;i<=n;i++) ... a[i] ...

Должно быть

  for (i=0;i<n;i++) ... a[i] ...

И возможно

  printf("May tinh so: %d\n",i+1);
0 голосов
/ 25 сентября 2010

Полагаю, вы спросите это в нужном месте - stackoverflow: D

Попробуйте изменить

struct maytinh a[n];

на

struct maytinh *a = (maytinh*) malloc(sizeof(maytinh) * n);

и вставить #include "malloc.h" тоже.

0 голосов
/ 25 сентября 2010

В дополнение к ответу ring0 размер или количество массивов в вашей структуре не должны иметь значения.Вы просто должны знать, что даже если вы выделяете символы в вашем массиве, это не мешает людям вводить более длинные строки (т. Е. Переполнение буфера).Вы должны всегда установить длину для форматов scanf (), чтобы она не переполнялась.Это делается путем добавления length-1 в %s.

. Также предполагая, что c-free 4.0 поддерживает динамические массивы, вам нужно использовать malloc() для выделения массива структуры по совету Рейндериена.1009 * т.е.

void main() {
    int n,i;
    printf("input :");
    scanf("%d",&n);
    struct maytinh a[n]; /* change to a malloc() call if it doesn't support dynamic arrays */
    for (i=0;i<n;i++) {    
        printf("May tinh so: %d\n",i);
        printf("Nhap ten may :");
        scanf("%9s",a[i].tenmay);
        printf("Nhap ma may :");
        scanf("%9s",a[i].mamay);
        printf("Nhap test :");
        scanf("%9s",a[i].test);
        printf("Nhap kich thuoc man hinh:");
        scanf("%d",&a[i].gia);
    };
}
...