C struct有很多[char array]问题

时间:2010-09-25 06:06:41

标签: c arrays scanf

我有一个像这样的多个char数组的结构(并且它可以工作):

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 个答案:

答案 0 :(得分:2)

我的第一个猜测是它无法分配更大的结构,因为你在堆栈而不是malloc()上分配它们,尽管我必须看到更多的示例代码来确定。

编辑:看起来我的猜测是正确的。您正在使用C的非标准扩展,使用非常数来分配数组。我打赌如果你用适当的malloc电话取代它,你的问题将得到解决。

答案 1 :(得分:1)

数组从C中的0开始

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

应该是

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

也许

  printf("May tinh so: %d\n",i+1);

答案 2 :(得分:0)

除了ring0的答案之外,结构中阵列的大小或数量也无关紧要。您应该知道,即使您在数组中分配字符,它也不会阻止人们输入更长的字符串(即缓冲区溢出)。您应该始终设置scanf()格式的长度,以确保它不会溢出。这是通过在length-1中添加%s来完成的。

另外假设c-free 4.0支持动态数组,你需要使用malloc()按照Reinderien的建议分配你的struct数组。

即,

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);
    };
}

答案 3 :(得分:0)

我想你是在正确的地方问的 - stackoverflow:D

尝试更改

struct maytinh a[n];

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

并插入#include "malloc.h"