在网站上编译pat乙级1002,数组有问题

首先,这个程序在visual studio 2017上输出结果是完全正确的甚至6.0也对,输出结果和官网例子一样。但是在网站上用c++ (g++)编译就不行,测试官网那个例子“1234567890987654321123456789”最后只会输出第一位“yi"。

#include <iostream>
using namespace std;
int main()
{
    
    int m, M, j, sum = 0, p = 1, i = 0;
    char a[11][5] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
    char b[101];
    cout << "input:";
    cin >> b;
    while (b[i])
    {
        sum = sum + b[i] - '0';
        i++;
    }
    M = sum;
    while (sum >= 10)
    {
        sum = sum / 10;
        p = p * 10;
    }
    while (p)
    {
        m = M / p;
        M = M % p;
        p = p / 10;
        for (j = 0; j < 5; j++)
            cout << a[m][j] ;
        cout << " " ;
    }
    return 0;
}

然后我调了半天,发现错误在for那里,因为例如”yi"它存入数组只使用了a[1][0],a[1][1],而for接下来会继续往下走走到a[1][2],导致while循环终止(个人理解,因为我的while确实不循环了)。
接下来我又尝试了如下:

#include <iostream>
     int main()
    {    
        int i = 0, j = 0;
        char c[7] = "char";
        for (i = 0; i < 4; i++)
            for (j = 0; j < 6; j++)
                cout << c[j];
    return 0;
    }

发现当j<4循环正常,输出四个char,j<5、6之类就只会输出一个,但是用visual studio 2017就一切正常,请问为什么。我倒是想过数组越界,但是又不像,个人能力太低,所以就来提问了。
没接触过g++,希望不要是什么很低级的错误要不然就太丢脸了。

因为数组长度为7,所以j=6不存在越界问题
c[7]中,前四个是字符c,h,a,r,后三个是0,ASCII码的0值。输出来也不可见。