#include
#include
//十六进制转十进制 int transformation(char *p)//p指主函数的data { int sum = 0; int length = strlen(p); int control = 1;//length是元素长度,要减去一才是最后的字符 int shiliu_cifan=0;//用于表示16的n次方 //进行2次循环 for (int count = 0;count <2;count++) { int number = p[length - control];//当不是十六进制的字母时,number就是十六进制的数字 switch (number) {//字符串的“123”不是整型的123 case (int)'A': number = 10; break; case (int)'B': number = 11; break; case (int)'C': number = 12; break; case (int)'D': number = 13; break; case (int)'E': number = 14; break; case (int)'F': number = 15; break; case (int)'0': number = 0; break; case (int)'1': number = 1; break; case (int)'2': number = 2; break; case (int)'3': number = 3; break; case (int)'4': number = 4; break; case (int)'5': number = 5; break; case (int)'6': number = 6; break; case (int)'7': number = 7; break; case (int)'8': number = 8; break; case (int)'9': number = 9; break; } control++;//让下一次循环,进行switch(最后第二个字符)
//乘16,转化为十进制
int control_1;
for ( control_1= 0;control_1 <shiliu_cifan;control_1++) {
number*=16;
}
shiliu_cifan++;
sum+=number;
}
return sum;
}
//输入语句,检索其是否传输正确,正确返回1,错误返回0 int determine_yihuo(char p)//p指主函数的data { int count = 2; int result = p[1]; while (p[count] != '') { result ^= p[count]; count++;//结束时,count即*的下标 }
int determine = 0;//定义初始结果为传输错误
if (result == transformation(p)) {
determine = 1;
}
return determine;
}
//输出北京时间 void BJ_time(char p)//p指主函数的data { int UTC_xiabiao = strspn(p,"$GPRMC");//UTC_xiabiao指$GPRMC后方的逗号的下标 int hours = 0,minute = 0,sound = 0; int count_1 = 1;//count_1指循环次数,也指hh:mm:ss中的第几个数 int number_1;//number_1用来存储p[UTC_xiabiao+count_1]转化为int型的单个数字 while (p[UTC_xiabiao+count_1] != '.') { switch ((int)p[UTC_xiabiao+count_1]) {//switch用于转化字符串“123”为int型123 case (int)'0': number_1 = 0; break; case (int)'1': number_1 = 1; break; case (int)'2': number_1 = 2; break; case (int)'3': number_1 = 3; break; case (int)'4': number_1 = 4; break; case (int)'5': number_1 = 5; break; case (int)'6': number_1 = 6; break; case (int)'7': number_1 = 7; break; case (int)'8': number_1 = 8; break; case (int)'9': number_1 = 9; break; } //得动UTC时间 if (count_1 <3) { hours = hours10+number_1; } else if (count_1 <5) { minute = minute10+number_1; } else if (count_1 <7) { sound = sound10+number_1; }
count_1++;
}
//输出北京时间
if (hours + 8 <24 ) {
if (hours+8 >=0 && hours+8 <10) {
printf("0%d:",hours+8);
} else {
printf("%d:",hours+8);
}
if (minute >=0 && minute <10) {
printf("0%d:",minute);
} else {
printf("%d:",minute);
}
if (sound >=0 && sound <10) {
printf("0%d",sound);
} else {
printf("%d",sound);
}
} else {
if (hours+8-24 >=0 && hours+8-24 <10) {
printf("0%d:",hours+8-24);
} else {
printf("%d:",hours+8-24);
}
if (minute >=0 && minute <10) {
printf("0%d:",minute);
} else {
printf("%d:",minute);
}
if (sound >=0 && sound <10) {
printf("0%d",sound);
} else {
printf("%d",sound);
}
}
}
int main(void) { char data[1000]; scanf("%999s",data); while (strcmp(data,"END") != 0) { if (strstr(data,"$GPRMC") == NULL) { scanf("%s",data); continue; } else { if (determine_yihuo(data)) {//判断校验是否正确 if (strchr(data,'V') == NULL) {//判断定位是都成功 BJ_time(data); } } }
scanf("%s",data);
}
return 0;
}