字符串数组排序,该如何处理

字符串数组排序
对字符串数组进行排序。比较是以各字符串的长度为依据,如果长度相等,再比较字符串的值,从小到大排序
语法没问题,就是程序一直崩溃,帮忙看一下是哪里出了问题,谢谢。

# include <iostream>
# include <string>
# include <stdlib.h>
using namespace std;
int compare(const void*a, const void*b);
int main()
{
char *a[] = { "enter","number","size","begin","of","cat","case","program","certain","a" };
qsort((void*)a, 10, sizeof(a[7]), compare);
for (int i = 0; i < 10; i++)
cout << a[i] << ",";
cout << endl;
return 0;
}

int compare(const void*a, const void*b)
{
char *p1, *p2;
p1 = (char*)a;
p2 = (char*)b;
if (strcmp(p1, p2) == 0)
return *p1 - *p2;
else
return strcmp(p1, p2);
}
------解决思路----------------------
char *a[] = { "enter","number","size","begin","of","cat","case","program","certain","a" };
改成
char a[][10] = { "enter","number","size","begin","of","cat","case","program","certain","a" };

用char *a[],字符串长度不相等,进入qsort函数就会发生错误,qsort((void*)a, 10, sizeof(a[7]), compare)也
不对,要改成qsort((void*)*a, 10, sizeof(a[7]), compare),用char a[][10]这儿不需要改。


------解决思路----------------------
LZ不是说要比较长度吗?长度呢?
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int compare(const void*a, const void*b);
int main()
{
    const char *a[] = { "enter","number","size","begin","of","cat","case","program","certain","a" };
    qsort(a, sizeof a/sizeof a[0], sizeof a[0], compare);
    for (int i = 0; i < 10; i++)
        cout << (!i+",") << a[i];
    cout << endl;
    return 0;
}

int compare(const void*a, const void*b)
{
    const char *p1, *p2;
    int len1,len2;
    p1 = *(const char**)a;
    p2 = *(const char**)b;
    len1=strlen(p1);
    len2=strlen(p2);
    if(len1!=len2)
        return len1-len2;
    else
        return strcmp(p1, p2);
}

------解决思路----------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。