C printf只打印一个元素时从数组中打印两个元素

时间:2017-12-26 19:25:26

标签: c arrays

我是编程新手并且遇到一些问题...

运行代码时的输出有点不对,输出中的第3行应该只有星期三。是什么导致了这个问题?

#include <stdio.h>

int main(){

    enum weekdays {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
    enum weekdays current_day;

    float highest_temperature = 0;
    float average_temperature = 0;
    float current_temperature = 0;

    char show_weekdays[7][9] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

    for(current_day = Monday; current_day <= Sunday; current_day++){

        printf("Enter temperature for %s (in Celsius): ", show_weekdays[current_day]);
        scanf("%f", &current_temperature);

        average_temperature += current_temperature;

        if(current_temperature > highest_temperature){

            highest_temperature = current_temperature;

        }

    }

    average_temperature /= 7;

    printf("The average temperature was: %.2f Celsius\n", average_temperature);
    printf("The highest temperature was: %.2f Celsius\n", highest_temperature);

}

输出:

Enter temperature for Monday (in Celsius): 1
Enter temperature for Tuesday (in Celsius): 2
Enter temperature for WednesdayThursday (in Celsius): 3
Enter temperature for Thursday (in Celsius): 4
Enter temperature for Friday (in Celsius): 5
Enter temperature for Saturday (in Celsius): 6
Enter temperature for Sunday (in Celsius): 7
The average temperature was: 4.00 Celsius
The highest temperature was: 7.00 Celsius

2 个答案:

答案 0 :(得分:6)

字符串"Wednesday"需要10个字符,而不是9个字符串。字符串由结束空字符'\0'终止,并包含该字符串。{/ p>

您拥有它的声明并非违法(这就是您没有收到编译时警告或错误消息的原因)。作为一种特殊情况,C允许您使用字符串文字来初始化文字的确切长度的数组(长度比大小小1)。终止'\0'将不会被存储。如果您不依赖于有效字符串的内容,那就没关系,但是您可以这样做。 (严格来说,你的程序的行为是未定义的,但这是一个我们不需要进入的微妙点。)

定义show_weekdays的更好方法是作为指针数组,每个指针都指向一个字符串:

const char *const show_weekdays[] = {
    "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
};

(当我说“更好”时,我的意思是它不容易出错并且更容易维护。额外的存储空间可能会有一些成本来保存指针,但对于这么大的东西来说这是微不足道的。)

计算机非常善于计算事物。让他们尽可能为你做。

这两个const确保您不会意外地尝试修改它们指向的指针或字符串。

答案 1 :(得分:4)

数组长度太短,“星期三”有9个字母,需要一个空字符串终止符。

char show_weekdays[7][9];

应该是

char show_weekdays[7][10];

如果数组中有空间,C编译器只包含该字符串终结符。只有在数据空间不足时,编译器才会抱怨。