本人在https://vijos.org/p/1001做这个题目的时候,提交代码出现了runtime error 错误。就用vs2013在本地调试,调试发现了一个有趣的现象,本人不修改程序的逻辑代码,仅仅是更改了变量的声明顺序,就使程序提交成功。假如说这类网站的编译器不一样,要求我们遵守相应d代码规范才可以提交成功的话,本人倒也可以理解。可是本人就在本地使用vs2013调试编译,其余的代码不变,仅仅是更改了变量的顺序,程序执行就出现了异常,这本人就不知道是什么原因了,莫非C语言在使用的时候,对变量的生命顺序有要求?希望C语言资深专家能够为本人解惑,本人先在这里谢谢大家了。
题目原题地址:https://vijos.org/p/1001
题目的样例输入时这样的:
题目原题地址:https://vijos.org/p/1001
题目的样例输入时这样的:
4 YaoLin 87 82 Y N 0 ChenRuiyi 88 78 N Y 1 LiXin 92 88 N N 0 ZhangQin 83 87 Y N 1
题目的样例输出
ChenRuiyi 9000 28700
下面给出程序代码,这段代码可以得到题目给出的样例输出(也可以在网上提交通过,但是这不是重点,本人不清楚为什么在vs2013下,程序不变,只改变变量顺序,程序就会异常):
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ int a; int scholarshipTotal = 0; char firstName[20]; int mostMoney = 0; char name[20]; int countMoney = 0; char c; int scoreA = 0; int scoreB = 0; char isLeader; char isWestStu; int num = 0; int i = 0; int len = 0; scanf("%d", &a); while (a--){ i = 0; while (" " != (c = getchar())){ name[i++] = c; } scanf("%d%d %c %c%d", &scoreA, &scoreB, &isLeader, &isWestStu, &num); if (scoreA > 80 && num > 0){ countMoney += 8000; } if (scoreA>85 && scoreB>80){ countMoney += 4000; } if (scoreA>90){ countMoney += 2000; } if (scoreA > 85 && isWestStu == "Y"){ countMoney += 1000; } if (scoreB > 80 && isLeader == "Y"){ countMoney += 850; } if (countMoney > mostMoney){ //strcpy(firstName, name); mostMoney = countMoney; for (i = 0; i < strlen(name); i++){ firstName[i] = name[i]; } len = strlen(name); } scholarshipTotal += countMoney; memset(name, 0, strlen(name)); countMoney = 0; } for (i = 0; i < len; i++){ printf("%c", firstName[i]); } printf("\n"); printf("%d\r\n", mostMoney); printf("%d\r\n", scholarshipTotal); return 0; }
接下来什么也不改变,只是把本人的变量顺序换成下面的这段程序就会异常:
/* int a; char name[20]; char c; char firstName[20]; int scoreA = 0; int scoreB = 0; char isLeader; char isWestStu; int num = 0; int countMoney = 0; int mostMoney = 0; int scholarshipTotal = 0; int i = 0; int len = 0; */
解决方案
40
编译器可能按声明变量顺序安排他们的位置,对字符串操作严重依赖在何处能找到字符串结束标志,假如没有,就用最近的”\0″,而它很可能是你上次赋值的其他变量的值的一部分。
建议这样改,在
建议这样改,在
while (" " != (c = getchar())){ name[i++] = c; }
后面加上
name[i] = "\0";