刚接触数组没学指针,C语言

img

这个显示Runtime Error:Segmentation fault;不知道是因为什么

以下是原题
题目描述
输入多个数,用冒泡排序,按从大到小的顺序输出。
特殊要求

输入
第一行输入个数n,范围在1-20之间

随后输入n个整数。

输出
第一行输出冒泡前的n个整数:先输出:"before:\t",然后是n个数,用\t间隔,注意最后没有\t

第二行输出冒泡后的n个整数:先输出:"after:\t",然后是n个数,用\t间隔,注意最后没有\t

如果输入的数据超界,输出:"input error"
样例输入
9
1 2 3 4 5 6 7 8 9
样例输出
before: 1 2 3 4 5 6 7 8 9
after: 9 8 7 6 5 4 3 2 1

14行输入需要加取地址符号&
scanf("%d",&n);
27行,for循环中是j++,不是i++

14行n前面少了&
scanf("%d",&n);
27行,for循环是 for(j=0; j<n-1; j++) ,不是j<i-1;i++
28行,for循环是中k=n-1; ,不是k=i-1;
36行,;也是 q<n 不是q<i
你题目的解答代码如下:(如有帮助,望采纳!谢谢! 点击我这个回答右上方的【采纳】按钮)

#include<stdio.h>

void swap(int a[],int x, int y)
{
    int t=a[x];
    a[x]=a[y];
    a[y]=t;
}
int main()
{
    int s[30];
    int n;
    int i,p,q,j,k;
    scanf("%d",&n);
    if(n>=1 && n<=20) {
        for(i=0;i<n;i++)
            scanf("%d",&s[i]);
        printf("before:");
        for(p=0;p<n;p++)
            printf("\t%d",s[p]);
        printf("\n");
        for (j=0; j<n-1; j++)
            for (k=n-1; k>j; k--)
                if(s[j]<s[k])
                    swap(s,j,k);
        printf("after:");
        for(q=0;q<n;q++)
            printf("\t%d",s[q]);
    }
    else
       printf("input error");
    return 0;
}

img

27行,最后i++改为j++试试