二维字符数组有问题

时间:2019-12-03 11:07:25

标签: c

所以我有一个作业,程序要询问10辆汽车的品牌(10个字母),型号(10个字母),年龄(1986年至2019年)和成本(正实数),然后希望该程序检查哪辆车最古老,并打印出其品牌和型号。我对第一部分没有问题,但是对第二部分有问题。 代码是:

//First part
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define C 10
    #define M 11

    int main(void)
    {   

        char brand[C][M];
        char model[C][M];
        int year[C];
        float cost[C];
        int i, len1, len2, min;

for(i=0; i<C; i++){
        printf("Car %d\n", i+1);

        do{
        printf("Brand: ");
        scanf("%s", brand[i]);
        len1 = strlen(brand[i]);
        } while(len1<0 || len1>10);

        do{
        printf("Model: ");
        scanf("%s", model[i]);
        len2 = strlen(model[i]);
        } while(len2<0 || len2>10);

        do{
            printf("Year: ");
            scanf("%d", &year[i]);
        } while(year[i]<1986 || year[i]>2019);

        do{
            printf("Cost: ");
            scanf("%d", &cost[i]);
        } while(cost[i]<=0);
}
//Second part
    year[0] = min;
    for(i=0; i<10; i++)
        if(year[i] < min){
            min = year[i];
            printf("\nThe oldest car is %s %s\n", brand[i], model[i]);
        }

由于某种原因,它要么在品牌[i]的位置打印出乱码,要么如果我丢了if语句的列,则打印出所有汽车品牌及其型号,而我只想找到最早的一个。

1 个答案:

答案 0 :(得分:0)

除了scanf not being recommended之外,此代码还存在一些问题,首先,当您阅读品牌和型号时:

do{
    printf("Brand: ");
    scanf("%s", brand[i]);
    len1 = strlen(brand[i]);
} while(len1<0 || len1>10);

这里的问题是,您首先将字符串写入brand[i],然后检查它是否太长,但是您已经将其写入数组,因此,如果字符串长于您的空间,则您已经有一个缓冲区溢出。使用scanf限制scanf("%10s, brand[i])可以读取的大小,或者最好使用fgets(brand[i], sizeof(brand[i]), stdin)

接下来,在第二部分中,您将使用min而不对其进行初始化,并用它覆盖year[0]的内容。您可能想要类似的东西:

min = 2020; // or a number that will be bigger than all your cars anyway
int older = 0; 
i = 0;
for(i=0; i<C; i++){ // Use C here, you have it might as well use it instead of magic numbers
    if(year[i] < min){
        older = i;
        min = year[i];
    }
}
printf("\nThe oldest car is %s %s\n", brand[older], model[older]);

但请记住,如果该解决方案是最老的且具有相同年份的汽车,它将打印多辆汽车