C语言中引发异常类型(以下代码,哪有问题?望指教)

用指向指针的指针的方法对5个字符串排序并输出
#include<stdio.h>
#include<string.h>
void main()
{
void px(char**p);
char chr[5][20], *q[5], **p = q;
int i;
for (i = 0;i < 5;i++) gets_s(chr[i],19);
fflush(stdin);
for (i = 0;i < 5;i++) q[i] = chr[i];
px(p);
for (i = 0;i < 5;i++) printf("%s",*p[i]);
getchar();
}

void px(char**p)
{
char*q = NULL;
int i, j;
for (i = 0;i < 4;i++)
{
for (j = i+1;j < 5;j++)
{
if (strcmp(*(p+j), *(p+i)) < 0)
{
q = *(p + i);
*(p + i) = *(p + j);
*(p + j) = q;
}
}

}
}

原因是第12行引起的

p是指向字符串的指针

p[i]已经是字符串了

此时如果再*p[i]就是单个字符了

因此应该是p[i]

更正后的代码:

#include<stdio.h>
#include<string.h>
void main()
{
void px(char**p);
char chr[5][20], *q[5], **p = q;
int i;
for (i = 0;i < 5;i++) gets_s(chr[i], 19);
fflush(stdin);
for (i = 0;i < 5;i++) q[i] = chr[i];
px(p);
for (i = 0;i < 5;i++) printf("%s", p[i]);
getchar();
}

void px(char**p)
{
char*q = NULL;
int i, j;
for (i = 0;i < 4;i++)
{
for (j = i + 1;j < 5;j++)
{
if (strcmp(*(p + j), *(p + i)) < 0)
{
q = *(p + i);
*(p + i) = *(p + j);
*(p + j) = q;
}
}

}
}

追问

非常感谢,找了好久,都没发现。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-07-16
#include<stdio.h>
#include<string.h>
void main()
{
    void px(char**p);
    char chr[5][20], *q[5], **p = q;
    int i;
    for (i = 0; i < 5; i++) gets(chr[i]);
    fflush(stdin);
    for (i = 0; i < 5; i++) q[i] = chr[i];
    px(p);
    for (i = 0; i < 5; i++) printf("%s\n",p[i]);    /*p是二维指针,p[i]是一维指针,等同于q[i],所以如果要用%s输出字符串,前面就不要再加*号了。*/
    getchar();
}

void px(char**p)
{
    char*q = NULL;
    int i, j;
    for (i = 0; i < 4; i++)
    {
        for (j = i+1; j < 5; j++)
        {
            if (strcmp(*(p+j), *(p+i)) < 0)
            {
                q = *(p + i);
                *(p + i) = *(p + j);
                *(p + j) = q;
            }
        }

    }
}

本回答被提问者采纳
相似回答