冒泡排序中的字符数组

character array in bubble sort

我编写了以下代码来获取二维字符数组中的排序字符串

#include <stdio.h>
#include <string.h>

void swap(char *,char *);

void main() {
    char a[20][20];
    int Pass = 0, i = 0, j = 0, n;

    printf("\nHow many elements you want to sort ? >> ");
    scanf("%d", &n);
    printf("\n\nEnter the elements to be sorted :\n");
    for (i = 0; i < n; i++)
        scanf("%s", a[i]);
    for (Pass = 1; Pass < n; Pass++) {
        for (j = 0; j < n - Pass; j++)
            if (strcmp(a[j], a[j + 1]) < 0)
                swap(a[j], a[j + 1]);
        printf("\n\nPass = %d\n", Pass);
        for (i = 0; i < n; i++)
            printf(" %s  ", a[i]);  
    }   
}

void swap(char *a, char *b) {
    char *t;
    *t = *a;
    *a = *b;
    *b = *t;
}

但是,我得到的输出是

How many elements you want to sort ? >> 5
Enter the elements to be sorted :
1 2 3 4 5
Pass = 1
2   3   4   5   1  
Pass = 2
3   4   5   2   1  
Pass = 3
4   5   3   2   1  
Pass = 4
Segmentation fault (core dumped)

为什么会遇到segmentation fault? (如果我使用整数数组而不是字符数组,相同的代码可以正常工作)

入口点main 应该定义为

int main()

或(带参数)

int main(int argc, char* argv[])

但可能会或可能不会 return 一些值。


在函数 swap 中,您正在访问导致 undefined behavior 的未初始化指针。不需要使用指针。使用普通 char.

void swap(char *a,char *b)
{
    char t;
    t=*a;
    *a=*b;
    *b=t;
}

同样为了避免缓冲区溢出,你应该告诉scanf()要从输入缓冲区扫描多少个字符

scanf("%19s",a[i]);

并检查扫描是否成功。

现在你应该得到正确的结果。 Here is fixed code.

您弄乱了 swap 方法中的指针。目前您正在做:

void swap(char *a,char *b)
{
    char *t;
    *t=*a;
    *a=*b;
    *b=*t;
}

这一行 *t = *a 似乎很可能是 SEGV 的候选者,因为 t 是一个未初始化的字符指针。我 运行 你的代码通过 gdb 和 gdb 也说了同样的话:

Reading symbols from a.out...done.
(gdb) run
Starting program: /home/rohan/Documents/src/a.out 

How many elements you want to sort ? >> 5


Enter the elements to be sorted :
1 2 3 4 5

Program received signal SIGSEGV, Segmentation fault.
0x0000555555554a21 in swap (a=0x7fffffffdce0 "1", b=0x7fffffffdcf4 "2") at testBubble.c:26
26      *t=*a;
(gdb) 

您不需要将 t 作为指针变量。它只是交换所需的临时变量。所以像这样改变你的方法,在我的例子中修复了分段错误:

void swap(char *a,char *b)
{
    char t;
    t=*a;
    *a=*b;
    *b=t;
}

交换函数不正确:您取消引用未初始化的指针 t,导致未定义的行为:在您的情况下是分段错误。

您应该将 t 定义为 char:

void swap(char *a, char *b) {
    char t;
    t = *a;
    *a = *b;
    *b = t;
}

但这只适用于具有单个字符的单词。

要交换最多 19 个字节的字,请使用:

void swap(char *a, char *b) {
    char t[20];
    strcpy(t, a);
    strcpy(a, b);
    strcpy(b, t);
}

并在main函数中添加一些额外的测试和保护以避免未定义的行为:

int main(void) {
    char a[20][20];
    int Pass = 0, i = 0, j = 0, n;

    printf("\nHow many elements you want to sort ? >> ");
    if (scanf("%d", &n) != 1 || n < 0 || n > 20)
        return 1;
    printf("\n\nEnter the elements to be sorted :\n");
    for (i = 0; i < n; i++) {
        if (scanf("%19s", a[i]) != 1)
            return 1;
    }
    for (Pass = 1; Pass < n; Pass++) {
        for (j = 0; j < n - Pass; j++) {
            if (strcmp(a[j], a[j + 1]) < 0)
                swap(a[j], a[j + 1]);
        }
        printf("\nPass = %d\n", Pass);
        for (i = 0; i < n; i++)
            printf(" %s", a[i]);
        printf("\n"); 
    }
    return 0;  
}