我是编程新手并且遇到一些问题...
运行代码时的输出有点不对,输出中的第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", ¤t_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
答案 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编译器只包含该字符串终结符。只有在数据空间不足时,编译器才会抱怨。