自测对了,代码为什么越界?

题目描述
时间的表示方法有24小时制和12小时制,无论是哪种,都可以描述成"小时:分钟:秒钟"。现在给出一个24小时制的时间,请你将其转换成12小时制的时间,并输出。
输入格式
一个24小时制的时间
输出格式
一个12小时制的时间
样例输入
13:30:25
样例输出
01:30:25
样例说明
小时、分钟、秒钟的每个部分都由两位数字构成,不足两位的在前面补0.
数据范围
数据很友好,没有特殊的时间。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char a[8];
    gets(a);
    if(a[1]<=50) puts(a);
    else {
        cout<<a[0]-49<<a[1]-50;
        for(int i=2;i<=strlen(a);i++) cout<<a[i];
    }
    return 0;
}

搞得太复杂了。可以用%d:%d:%d格式输入,用三个整数接收。修改只需要调整小时就可以了
你代码中if(a[1]<=50) puts(a)是不对的。'0'的ASCII码是48,50都到2了

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int h,m,s;
    char c1,c2;
    cin>>h>>c1>>m>>c2>>s;
    if(h>=12)
        h-=12;
    cout<<setw(2)<<setfill('0')<<h<<c1<<setw(2)<<setfill('0')<<m<<c2<<setw(2)<<setfill('0')<<s;
    return 0;
}